【问题标题】:Raycast along objects face while keeping the ray horizontal in unity沿物体面投射光线,同时保持光线水平统一
【发布时间】:2022-01-09 10:58:57
【问题描述】:

我正在尝试沿对象面进行光线投射,以便在由对象制成的容器中创建液体表面的网格,无论其旋转如何。 目前我正在使用 X 和 Z 进行 transform.up/right/forward,但将 Y 设置为 0 作为光线投射的方向。这似乎工作单位对象在多个轴上旋转。

Example of error

您可以在这里看到绿色光线投射的方向不是沿着脸部。我认为解决方案可能与获取我忽略的 y 值并以某种方式将其应用于 x 和 z 有关。

这是一个概念,玩家将使用原始碰撞器构建自己的容器,因此无论对象旋转如何,它都能正常工作。

【问题讨论】:

  • 你已经尝试过什么代码?您是否已经有办法计算您感兴趣的面部的法线?
  • 你能更详细地描述一下“沿对象面投射光线”的意思吗?
  • @NSJacob1 基本上沿对象变换进行光线投射,同时使光线始终是水平的(在世界空间中)。
  • @Ruzihm 到目前为止我所尝试的是为每个方向制作射线的方向Vector3(object.transform.right.x,0 ,object.transform.right.z) 等等。它一直有效,直到您在所有 3 个轴上旋转对象。我可以从光线投射命中获得法线,因为光线的原点是从光线撞击物体的接触点获得的。
  • 所以...只是为了确保我理解...您正在寻找位于水平平面和对象表面的向量?

标签: c# unity3d rotation raycasting direction


【解决方案1】:

如果您有感兴趣的曲面的法线,您可以使用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;
    }
}

【讨论】:

  • 完美,完全符合我的要求。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2022-09-22
  • 2022-06-15
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多