如何从Hololens achor保存/获得轮换?

时间:2018-01-11 16:06:52

标签: c# augmented-reality hololens

我在我的应用程序中使用锚点作为“世界的中心”,而不是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中保存/获取我的锚的旋转?

2 个答案:

答案 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);