我正在研究某些物体可以由用户通过鼠标移动。每当拖动时它们都会捕捉到地形,因此它们实际上无法从地形上拉下来。在我参与该项目之前,这已经到位。
我的任务是使物体不仅在位置上而且在旋转上(拥抱斜坡等)。目前我已经制作了一个预制片,可以向地面射出3条光线(物体的对象)。我平均命中的法线,然后将对象的向上矢量设置为该值。起初我认为工作正常,因为我正在测试一个立方体,无法直观地看到问题。
然后我尝试了卡车模型。看起来很好,但后来我旋转了卡车,然后再次拖动,我发现它正在捕捉到与我开始拖动之前不同的y旋转。我认为这是因为当我直接设置时,向前矢量会自动重新计算。
以下是我执行我指定的工作的更新方法。如果有人能告诉我如何达到预期效果,我将不胜感激。
void Update()
{
//TargetObject.transform.position+=-TargetObject.transform.up*Time.deltaTime;
//_snapChildren.ToArray()[2].transform.RotateAround(new Vector3(0.0f, 1.0f, 0.0f), Time.deltaTime);
//Debug.LogWarning("Mouse Button 0 down: "+Input.GetMouseButton(0));
if (_OI.GetActiveObject()==TargetObject.gameObject && _OI.GetActiveObjectDragging())
{
//Debug.LogWarning("We are the active object being dragged!!");
//_curHitInfo=_snapChildrenHitInfos.ToArray()[0];
if (Physics.Raycast(TargetObject.transform.position, -TargetObject.transform.up, out _hitInfo, 100.0f,
_targetLayerMask))
{
_normals.Clear();
_normals=new List<Vector3>();
//Debug.LogWarning("Ding!! "+_hitInfo.transform.name);
for (int iChild=0; iChild<_snapChildren.Count; iChild++)
{
_curHitInfo=_snapChildrenHitInfos.ToArray()[iChild];
//Debug.LogWarning("LayerMask.NameToLayer(\"Draggable\"): "+(1 << LayerMask.NameToLayer("Draggable")));
Physics.Raycast(_snapChildren.ToArray()[iChild].transform.position,
-_snapChildren.ToArray()[iChild].transform.up, out _curHitInfo, 100.0f,
_targetLayerMask);
_normals.Add (new Vector3(_curHitInfo.normal.x, _curHitInfo.normal.y, _curHitInfo.normal.z));
//Debug.LogWarning("Ding!! "+iChild+' '+_curHitInfo.transform.name);
//Debug.LogWarning("_curHitInfo.normal: "+_curHitInfo.normal);
/*Debug.LogWarning("_snapChildrenHitInfos.ToArray()[iChild].normal: "+
_snapChildrenHitInfos.ToArray()[iChild].normal);*/
//Debug.LogWarning("_normals.ToArray()[iChild]: "+_normals.ToArray()[iChild]);
}
Vector3 avgNormal=new Vector3(0.0f, 0.0f, 0.0f);
for (int iNormal=0; iNormal<_normals.Count; iNormal++)
{
avgNormal+=_normals[iNormal];
//Debug.LogWarning("_normals["+iNormal+"]: "+_normals[iNormal]);
}
avgNormal/=_normals.Count;
//Debug.LogWarning("avgNormal: "+avgNormal);
//TargetObject.transform.localRotation=Quaternion.Euler(avgNormal);
TargetObject.transform.up=avgNormal; //MAKE A POST ON STACK OVERFLOW...if limiting rotation to x/z
//doesn't work
}
}
}