給定三個點,我正在嘗試在 Unity 中以 3D 方式旋轉平面。這些點并不總是相同的,但它們總是在這張圖片中的紅點上
我知道這些點的絕對位置,以及它們相對于平面的位置。例如,我可能知道點 (-5, 5) 位于 (10, -4, 13) 上。
我知道當三個點在一條線上時(例如 (-5, 5), (0, 5) 和 (5, 5)),不可能計算完整的旋轉,所以當這是案子。但是,當三個點不在一條線上時,應該可以計算完整的旋轉。
到目前為止,我已經使用下面的代碼來旋轉,但這錯過了繞 y 軸的旋轉(示例使用點 (-5, 5)、(5, 5) 和 (-5, -5))。
Vector3 p1 = Point1.transform.position;// point 1 absolute position
Vector3 p1Relative = new Vector3(-5, 0, 5);
Vector3 p2 = Point2.transform.position;// point 2 absolute position
Vector3 p2Relative = new Vector3(5, 0, 5);
Vector3 p3 = Point3.transform.position;// point 3 absolute position
Vector3 p3Relative = new Vector3(-5, 0, -5);
Gizmos.DrawSphere(p1, .1f);
Gizmos.DrawSphere(p2, .1f);
Gizmos.DrawSphere(p3, .1f);
Vector3 normal = Vector3.Cross(p2 - p1, p3- p1);
rotator.transform.up = normal;
我將如何擴展或更改此代碼以包括繞 Y 軸的旋轉?先感謝您。
uj5u.com熱心網友回復:
這個答案使用了robjohn在數學堆疊交換上描述的這種方法。
您可以解決幾個Matrix4x4s ,您可以使用它們將第一個坐標系轉換為第二個坐標系,然后使用它來計算原點(中心點)和旋轉以對齊軸(使用Quaternion.LookRotation);
public class test : MonoBehaviour
{
[SerializeField] Transform point1;
[SerializeField] Transform point2;
[SerializeField] Transform point3;
[SerializeField] Vector2 relativePos1;
[SerializeField] Vector2 relativePos2;
[SerializeField] Vector2 relativePos3;
[SerializeField] Transform demonstrator;
void Update()
{
Vector3 absolutePos1 = point1.position;
Vector3 absolutePos2 = point2.position;
Vector3 absolutePos3 = point3.position;
Vector3 relativePos4 = (Vector3)relativePos1
Vector3.Cross(relativePos2 - relativePos1,
relativePos3 - relativePos1);
Vector3 absolutePos4 = absolutePos1
Vector3.Cross(absolutePos2 - absolutePos1,
absolutePos3 - absolutePos1);
Vector4 rightColumn = new Vector4(0, 0, 0, 1);
Matrix4x4 P = new Matrix4x4(relativePos2 - relativePos1,
relativePos3 - relativePos1,
relativePos4 - (Vector3)relativePos1, rightColumn);
Matrix4x4 Q = new Matrix4x4(absolutePos2 - absolutePos1,
absolutePos3 - absolutePos1,
absolutePos4 - absolutePos1, rightColumn);
Vector3 originPos = TransformPos(P, Q, Vector3.zero);
// up in source is forward in output
Vector3 forwardPos = TransformPos(P, Q, Vector3.up);
// back in source is up in output
Vector3 upPos = TransformPos(P, Q, Vector3.back);
demonstrator.position = originPos;
demonstrator.rotation = Quaternion.LookRotation(forwardPos
- originPos, upPos - originPos);
}
Vector3 TransformPos(Matrix4x4 P, Matrix4x4 Q, Vector3 input)
{
Matrix4x4 invP = P.inverse;
return Q * invP * input ((Vector4)point1.position
- Q * invP * relativePos1);
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/371810.html
上一篇:unityC#從位元組加載影像
下一篇:Unity3DUWPHololens:使用InputField的Web門戶輸入,無需彈出TouchScreenKeyboard
