2014-05-17 78 views
0

即時嘗試在由不同對象構成的路徑之間移動。我使用Translate()和Rotating(使用光線投射從右側物體的垂直向量旋轉)使用光線投射垂直於對象移動

儘管它轉動得不夠快,無法完全轉動並移出路徑。

任何想法如何解決這個問題?或者以其他方式來實現它?

任何幫助將不勝感激

圖像以幫助觀察: Raycast and Rotation image

 
 
    void Update() 
    { 
     RaycastHit hit; 

     if (!Physics.Raycast(transform.position, Vector3.right, out hit)) 
      return; 

     MeshCollider meshCollider = hit.collider as MeshCollider; 
     if (meshCollider == null || meshCollider.sharedMesh == null) 
      return; 


     Mesh mesh = meshCollider.sharedMesh; 
     Vector3[] normals = mesh.normals; 
     int[] triangles = mesh.triangles; 
     Vector3 n0 = normals[triangles[hit.triangleIndex * 3 + 0]]; 
     Vector3 n1 = normals[triangles[hit.triangleIndex * 3 + 1]]; 
     Vector3 n2 = normals[triangles[hit.triangleIndex * 3 + 2]]; 
     Vector3 baryCenter = hit.barycentricCoordinate; 
     Vector3 interpolatedNormal = n0 * baryCenter.x + n1 * baryCenter.y + n2 * baryCenter.z; 
     interpolatedNormal = interpolatedNormal.normalized; 
     Transform hitTransform = hit.collider.transform; 

     interpolatedNormal = hitTransform.TransformDirection(interpolatedNormal); 



     Vector3 targetDir = Vector3.Cross(interpolatedNormal, Vector3.up); // Get the perpendicular vector 



     Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, 20f, 0f); 
     transform.rotation = Quaternion.LookRotation(newDir); // Rotate Object 



     transform.Translate(0,0,0.2f); // Constant Speed 
     Debug.DrawRay(transform.position, perp,Color.red); 


    } 

回答

0

我不認爲這是一個很好的方法,但它爲我工作。也許這可以幫助你。

public float fixedDist = 2.0f; 
void WallDetect() { 
    RaycastHit hit; 
    if (!Physics.Raycast(transform.position, transform.TransformPoint(Vector3.right) - transform.position, out hit)) 
     return; 

    Vector3 perp = Vector3.Cross(hit.normal, Vector3.up); 
    Vector3 targetDir = Vector3.Project(transform.forward, perp).normalized; 
    Vector3 currentDir = transform.TransformPoint (Vector3.forward) - transform.position; 

    RaycastHit hit2; 
    if (Physics.Raycast (transform.position, -hit.normal, out hit2)) { 
     Vector3 fixedPos = hit2.point + hit.normal * fixedDist; 
     Vector3 predictPos = fixedPos + targetDir; 

     transform.position = Vector3.MoveTowards (transform.position, predictPos, 0.01f); 
     transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation (predictPos - transform.position), 0.05f); 
    } 
}