沿物体面进行光线投射,同时保持光线水平统一
Raycast along objects face while keeping the ray horizontal in unity
我正在尝试沿着物体的面进行光线投射,以便在由物体制成的容器中创建液体表面的网格,无论它们的旋转如何。
目前我正在进行变换。up/right/forward 使用 X 和 Z,但将 Y 设置为 0 作为光线投射的方向。这似乎适用于对象在多个轴上旋转的单元。
Example of error
这里可以看到绿色光线投射的方向不是沿着脸部的。我认为解决方案可能与采用我忽略的 y 值并以某种方式将其应用于 x 和 z 有关。
这是一个概念,玩家将使用原始碰撞器构建自己的容器,因此无论对象旋转如何,它都有效。
如果您有感兴趣的表面法线,您可以使用 Vector3.Cross
找到同样垂直于 up 的切线。只要确保在向上事件中检查结果是否为 (0,0,0) 并且法线共线,然后您可以选择任意世界水平方向。
public class test : MonoBehaviour
{
void Update()
{
Vector3 dir = HorizontalTangent(transform.up);
Debug.DrawLine(transform.position, transform.position + dir,Color.red, 0f);
}
Vector3 HorizontalTangent(Vector3 surfaceNorm)
{
Vector3 res = Vector3.Cross(Vector3.up, surfaceNorm);
if (res == Vector3.zero) res = Vector3.right;
return res;
}
}
我正在尝试沿着物体的面进行光线投射,以便在由物体制成的容器中创建液体表面的网格,无论它们的旋转如何。 目前我正在进行变换。up/right/forward 使用 X 和 Z,但将 Y 设置为 0 作为光线投射的方向。这似乎适用于对象在多个轴上旋转的单元。
Example of error
这里可以看到绿色光线投射的方向不是沿着脸部的。我认为解决方案可能与采用我忽略的 y 值并以某种方式将其应用于 x 和 z 有关。
这是一个概念,玩家将使用原始碰撞器构建自己的容器,因此无论对象旋转如何,它都有效。
如果您有感兴趣的表面法线,您可以使用 Vector3.Cross
找到同样垂直于 up 的切线。只要确保在向上事件中检查结果是否为 (0,0,0) 并且法线共线,然后您可以选择任意世界水平方向。
public class test : MonoBehaviour
{
void Update()
{
Vector3 dir = HorizontalTangent(transform.up);
Debug.DrawLine(transform.position, transform.position + dir,Color.red, 0f);
}
Vector3 HorizontalTangent(Vector3 surfaceNorm)
{
Vector3 res = Vector3.Cross(Vector3.up, surfaceNorm);
if (res == Vector3.zero) res = Vector3.right;
return res;
}
}