我有一个由[x0, y0, z0]
定义的三维点。
此点属于由[a, b, c, d]
定义的平面。
normal
= [a, b, c]
,并且ax + by + cz + d = 0
如何将三维点转换或映射为(u,v)
坐标对?
这一定是极其简单的事情,但我想不出来。
我有一个由[x0, y0, z0]
定义的三维点。
此点属于由[a, b, c, d]
定义的平面。
normal
= [a, b, c]
,并且ax + by + cz + d = 0
如何将三维点转换或映射为(u,v)
坐标对?
这一定是极其简单的事情,但我想不出来。
首先,您需要计算您的u
向量和v
向量。 u
向量和v
向量应该与所在平面的法向量正交,并且彼此之间也应该正交。没有唯一定义它们的方法,但可能有一种方便快捷的方法,如下:
n = [a, b, c]
u = normalize([b, -a, 0]) // Assuming that a != 0 and b != 0, otherwise use c.
v = cross(n, u) // If n was normalized, v is already normalized. Otherwise normalize it.
现在只需要一个简单的点积:
u_coord = dot(u,[x0 y0 z0])
v_coord = dot(v,[x0 y0 z0])
请注意,这假定v-v坐标的原点是世界坐标原点(0,0,0)。
即使向量 [x0 y0 z0]
不完全位于平面上,此方法仍可奏效。如果情况如此,它将只是将其投影到平面上。
t
向量做什么?当计算v_coord
时,v
向量来自哪里? - tigrouv
和 t
进行替换,但没有奏效,真正的原因是我的程序中 n
不正确。我修复了它,并且现在可以运行了。谢谢 - tigroudot([a,b,c],[x0,y0,z0]) = -d
其中dot是两个向量的点积。这只是平面方程的简单重写。
关键在于找到跨越平面子空间的两个向量。为此,我们选择一个长度为3的随机向量。称其为V0。我将称其为平面法向量。
N = [a,b,c]
V1 = cross(N,V0)
V1 = V1/norm(V1)
接下来,我们选择第二个向量V2,使其垂直于N和V1。同样地,向量叉积可以轻易地完成这一步骤。同样将该向量归一化为单位长度。(由于我们现在知道V1是一个单位范数的向量,所以我们也可以通过除以norm(N)来实现。)
V2 = cross(N,V1)
V2 = V2/norm(V2)
现在可以将平面上的任何一点简单地描述为(u,v)的函数,如下所示:
[x0,y0,z0] + u*V1 + v*V2