我用這個層次結構設定了一個場景:
- Environment
-RealWorldRefA
-RealWorldRefB
-3dModelContainer
-ModelRefA
-ModelRefB
-Model
目標是按下一個按鈕,3d 模型容器將被縮放和旋轉,使得 ModelRefA 和 ModelRefB 位于作為現實世界參考點的位置。
這里的目的是最終獲得我家攀巖墻的 3D 掃描模型。我的目標是在 AR 中設定現實世界中的參考點(在任務 2 中),然后使用這些來縮放 3d 模型并將其疊加到現實世界上。
到目前為止,我對這個場景的測驗腳本有 3 個步驟:
if (Input.GetKeyDown("space"))
{
AlignFirstReferencePoint();
ScaleModelToMatchRealReferenceDistance();
RotateModelToMatchReferenceAlignment();
}
第一個步驟作業正常,但我堅持第 3 步。
在步驟 1 中,將容器位置設定為等于現實世界 ref A 的位置
private void AlignFirstReferencePoint()
{
modelContainer.transform.position = realWorldRefA.transform.position;
}
太好了……然后是第 2 步,將 RealWorldRefA B 之間的距離與模型 ref A 和 B 之間的距離進行比較,然后縮放容器以使其匹配:
private void ScaleModelToMatchRealReferenceDistance()
{
float distanceBetweenRealRefs = Vector3.Distance(realWorldRefA.transform.position, transform.position);
float distanceBetweenModelRefs = Vector3.Distance(modelRefA.transform.position, modelRefB.transform.position);
float distanceRatio = distanceBetweenRealRefs / distanceBetweenModelRefs;
var x = modelContainer.transform.localScale.x;
var y = modelContainer.transform.localScale.y;
var z = modelContainer.transform.localScale.z;
modelContainer.transform.localScale = new Vector3(x*distanceRatio, y distanceRatio, z distanceRatio);
}
在第 3 步中,我需要旋轉模型……但是我們要添加矢量方向和四元數,在這里我有點迷失了……
在我的第一次嘗試中,我只是嘗試過: modelContainer.transform.LookAt(realWorldRefB.transform);
但這并沒有給出正確的方向。我猜模型和容器內的所有東西都必須沿著容器的特定軸對齊才能作業,所以這是不好的。
我想做的是更像是:
private void RotateModelToMatchReferenceAlignment()
{
Vector3 realWorldRefsDirection = realWorldRefA.transform.position realWorldRefB.transform.position;
Vector3 modelRefsDirection = modelRefA.transform.position modelRefB.transform.position;
//DO SOMETHING HERE TO ROTATE THE CONTAINER UNTIL THESE TWO VECTORS MATCH??
}
我已經閱讀了一些現有的帖子,但是 a) 它們有點超出我的頭腦 b) 它們似乎沒有像我使用的那樣使用參考點,這可能會增加一些復雜性,因此我無法輕松適應這些解決方案。
uj5u.com熱心網友回復:
首先方向是兩個位置之間的增量,而不是總和!
所以,如果你想從一個向量指向realWorldRefA朝realWorldRefB你想要的是
var realWorldRefsDirection = realWorldRefB.transform.position - realWorldRefA.transform.position;
并相應地
var modelRefsDirection = modelRefB.transform.position - modelRefA.transform.position;
然后你可以使用Quaternion.FromToRotation像例如
var deltaRotation = Quaternion.FromToRotation(modelRefsDirection, realWorldRefsDirection);
modelContainer.transform.rotation *= deltaRotation;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386429.html
標籤:统一3d
