我在我的应用程序中使用锚点作为“世界的中心”,而不是hololens是“世界的中心”。我实例化一个立方体并将其作为我的参考来显示我的3d对象。
我可以正常获得该位置,但旋转不是。总是当我改变场景并再次打开它时,立方体的位置参考是可以的。我的3d对象获得位置参考并显示正常,但旋转来自hololens。如果我旋转我的头(hololens),3d对象得到这个“旋转”并被更改,但我想要获得我的立方体锚的旋转。
这是我的代码:
//Instantiate the cube
AnchorController anchorController = anchorManager.GetComponent<AnchorController>();
referenceGameObject = GameObject.Find("Cube");
referenceGameObject = anchorController.instance;
//Getting the position and rotation of cube
Vector3 referencePosition = referenceGameObject.transform.position;
Quaternion referenceRotation = referenceGameObject.transform.rotation;
//Instantiate a 3d object and inside her I instantiate my 3d objects
GameObject parent = new GameObject("Obj3D");
Quaternion originalRot = parent.transform.rotation;
//step.anchorX/Y/Z is a coordinates that came from json file, are running perfectly.
//Here I get the position reference of my cube, works perfectly.
parent = Instantiate(parent, referencePosition, referenceRotation);
parent.transform.position = referencePosition;
parent.transform.position = parent.transform.position + (referenceGameObject.transform.right * step.anchorX);
parent.transform.position = parent.transform.position + (referenceGameObject.transform.forward * step.anchorY);
parent.transform.position = parent.transform.position + (referenceGameObject.transform.up * step.anchorZ);
//Here I'm getting the reference rotation of my cube and insert a rotation of my cube
parent.transform.Rotate(referenceRotation.eulerAngles.x, referenceRotation.eulerAngles.y, referenceRotation.eulerAngles.z);
//Here is my 3d objects
childObject = Instantiate(SetPrefab(step), parent.transform);
childObject.transform.localPosition = Vector3.zero;
object3d = parent;
if (step.HLScaleX != 0f && step.HLScaleY != 0f && step.HLScaleZ != 0f){
object3d.transform.localScale = new Vector3(step.HLScaleX, step.HLScaleY, step.HLScaleZ);
}
object3d.transform.localRotation = Quaternion.Euler(new Vector3(step.HLRotationX, step.HLRotationY, step.HLRotationZ));
简历中,
如何在Hololens中保存/获取我的锚的旋转?
答案 0 :(得分:0)
尝试使用本地参数。
我编写了代码,我使用手势来移动/旋转/缩放对象。
当识别出手势并调用OnManipulationStarted时,我保存了本地参数。
position = ObjectM.transform.localPosition;
rotation = ObjectM.transform.localRotation;
scale = ObjectM.transform.localScale;
然后调用OnManipulationUpdated并根据模式更新参数。 移动
transform.localPosition = positionCache + Vector3.up * delta.y * MOVE_FACTOR;
旋转
transform.localRotation = rotationCache;
transform.Rotate(Vector3.up * delta.x * ROTATE_FACTOR);
缩放需要更多代码来弥补负增量。 Delta是ManipulationEventData中识别的手势更改。有关手势操作的更多信息,建议您查看mixedrealitytoolkit Input Section。
希望这会有所帮助。
答案 1 :(得分:0)
如果你只是想让你的立方体成为你世界的中心&#34;那么你应该看看Unity的Transform.InverseTransformPoint和Transform.InverseTransformDirection以及这些方法的反面Transform.TransformPoint / Direction。
您只需要参考锚点的变换以及您想要传递的位置/方向。
transform.position = AnchorTransform.InverseTransformPoint(new Vector3(0,0,1));
如果您不想传递Vector3,也可以传入三个花车。
这样做取决于锚点的位置,并将你的新位置在z方向上放置1个单位。 InverseTransformPoint采用世界位置并将其转换为对象的本地位置。
通过执行以下操作可以为旋转做同样的事情:
transform.rotation = Quaternion.Euler(AnchorTransform.InverseTransformDirection(1,0,0);