作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一些事情,我在坐标系统 A 中有一架飞机,上面已经有一组点。我在空间 N 中也有一个法线向量。如何旋转坐标 sys A 上的点,以便底层平面与 N 具有相同的法线方向?
想知道是否有人对如何做到这一点有一个好主意。谢谢
最佳答案
如果您有或可以轻松计算您的点当前所在平面的法线向量,我认为最简单的方法是围绕两个平面的公共(public)轴旋转。以下是我的做法:
M
是当前平面的法线向量,N
是要旋转到的平面的法线向量。如果 M == N
您现在可以停止并保持原点不变。 costheta = dot(M,N)/(norm(M)*norm(N))
axis = unitcross(M, N)
unitcross
是一个执行叉积并将其归一化为单位向量的函数,即 unitcross(a, b) = cross(a, b) / norm(cross(a, b))
.如user1318499在评论中指出,如果 M == N
,此步骤可能会导致错误, 除非您执行 unitcross
返回 (0,0,0)
当a == b
. c = costheta
s = sqrt(1-c*c)
C = 1-c
rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ],
[ y*x*C+z*s y*y*C+c y*z*C-x*s ]
[ z*x*C-y*s z*y*C+x*s z*z*C+c ])
x
, y
, 和 z
是 axis
的组成部分.此公式描述为 on Wikipedia . newpoint = dot(rmat, point)
dot
执行矩阵乘法。 M
进入垂直于
N
的平面.这对应的事实是,在您执行上述步骤之后,您可以围绕
N
旋转平面。 ,并且您的积分将在同一平面上的不同位置。 (换句话说,您可以进行的满足您的条件的每次旋转都对应于执行上述过程,然后围绕
N
进行另一次旋转。)但是,如果您不在乎您的点在平面上的哪个位置结束,我认为这是围绕公共(public)轴旋转是将点放入您想要的平面的最简单方法。
M
,但是您确实有起始平面中点相对于该平面原点的坐标,您可以从两个点的位置
x1
计算起始法线向量和
x2
作为
M = cross(x1, x2)
unitcross
,但没有任何区别)。如果您有相对于不在平面内的原点的点坐标,您仍然可以这样做,但您需要三个点的位置:
M = cross(x3-x1, x3-x2)
关于math - 平面的 3D 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423621/
我在 StackOverflow 和其他地方看到了很多与此类似的问题,但没有一个直接解决我的问题。我正在 THREE.js 中使用凸包生成器生成 n 边多面体。我想将方形纹理映射到每个多面体的每个面上
我是一名优秀的程序员,十分优秀!