使用transform.LookAt冻结Y旋转?

时间:2017-02-17 18:26:29

标签: c# unity3d

[编辑] 解决了:

Vector3 relativePos = hit.point - pivot.transform.position; Vector3 rotation = Quaternion.LookRotation(relativePos).eulerAngles; pivot.transform.localEulerAngles = new Vector3(0, 0, rotation.y);

您好我最近遇到了一个问题。 我试图让这个对象看我的光线投射点,而不必旋转它。 正如你可以从图片中看到的那样,脚本无法正常工作。

the standard "gun" the "gun" after the transformation

我正在使用的代码:

Ray ray = theCamera.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0));
    RaycastHit hit;
    Physics.Raycast(ray, out hit);
    pivot.transform.LookAt(hit.point);
    pivot.transform.rotation = new Quaternion(0, pivot.transform.rotation.y, 0, 0)

问题: 是否可以使“蓝色箭头”查看保留在同一旋转平面中的“hit.point”? 很抱歉这个错误的解释,但我会发布一个我想要实现的结果的图像(红色立方体是光线投射点)。 enter image description here

3 个答案:

答案 0 :(得分:0)

尝试这样的事情:

// Keep the Y component the same as your transform
pivot.transform.LookAt(new Vector3(hit.point.x, this.transform.position.y, hit.point.z));

答案 1 :(得分:0)

我想你只想在Y上旋转,而不是X& Z'在任何情况下,您都不应该修改或创建部件中的四元数,请使用内置方法:

Vector3 rotation = Quaternion.LookRotation(relativePos).Euler
public Quaternion rotationAdjusted = Quaternion.Euler(0, rotation.eulerAngles.y, 0);
transform.rotation = rotationAdjusted

请参阅Quternion.EulerQuaternion.eulerAngles

答案 2 :(得分:0)

如果你需要的只是围绕Y轴旋转物体,在hit.point的方向,不影响X和Z轴...

...那么在那种情况下,我相信冻结X和Z旋转就可以了。

您可以在检查器中或通过代码执行此操作:

Rigidbody _rigidbody = GetComponent<Rigidbody>();
_rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ

这不是错误,因为它使用按位OR运算符。 另请注意,旋转约束应用于局部空间,而不是WorldSpace。

编辑:删除了第一个不需要的部分,因为我从第一次尝试中就没有理解这个问题:)