首页 > 解决方案 > Unity3D - 从相同世界位置的原始平面获取数学平面

问题描述

出于视觉目的,我在给定位置有一个 GameObject.Plane。从那开始,考虑到平面在世界空间中的旋转和位置,我必须制作一个数学平面以用于下一次计算,但有些东西不对劲。

我试过做

new Plane(go.transform.InverseTransformDirection(-go.transform.right), go.transform.InverseTransformPoint(go.transform.position));

其中go是原始平面对象。从后面的结果来看,它在世界空间中的位置似乎很好,但旋转却不是。

Primitive plane(go) 旋转了 90 度,所以它不是朝上,而是面向侧面。

这里出了什么问题?

编辑:当前设置是

go.transform.InverseTransformDirection(-go.transform.right);
return new Plane(go.transform.up, go.transform.position);

void OnDrawGizmos()
{
    Gizmos.color = Color.magenta; 
    Gizmos.DrawLine(planePrimitive.transform.position, planePrimitive.transform.position + plane.normal * 3f);      
}

标签: unity3dprimitiveplane

解决方案


这个

go.transform.InverseTransformDirection(-go.transform.right)

返回一个面向侧面的向量,您将其用作Plane's normal


原始Plane对象的法线就是它的局部transform.up向量。

然后注意 aPlane需要世界空间坐标,因此使用InverseTransformDirectionand没有意义,InverseTransformPoint因为transform.upandtransform.position已经在世界空间中。

new Plane(go.transform.up, go.transform.position);

如果您宁愿谈论原始Quad对象,那么您想要的向量就是-transform.forward

new Plane(-go.transform.forward, go.transform.position);

到你的小玩意儿:

你正在使用testPlane.normal就像它是一个位置。它不是!法线是一个方向,并没有说明位置。

你想要做的是例如(不使用本地空间小玩意)

Gizmos.DrawLine(go.transform.position, go.transform.position + testPlane.normal * 3f);

或者如果你只能依靠飞机本身使用

Gizmos.DrawLine(plane.distance, plane.distance + testPlane.normal * 3f);

在第二个平面中,是从到平面上最近点plane.distance的向量。0,0,0因此,它仍然不会完全位于给定平面对象的位置。


推荐阅读