在3D空间旋转后计算顶点位置



我试图在javascript中旋转y轴(在我自己的3D引擎中)我尝试了此功能:

function rotateY(amount) {
  for (var i = 0; i < points.length; i++) {
    points[i].z = Math.sin(amount) * points[i].x + Math.cos(amount) * points[i].z;
    points[i].x = Math.cos(amount) * points[i].x - Math.sin(amount) * points[i].z;
  }
}

它正在旋转,但是每次旋转时,它都会更改其X和Z比例,以便它变得更薄。.您能帮我如何正确旋转它吗?谢谢:)

假设i)旋转分为全局,而不是对象本身,ii)您要应用三角洲(如果我们不能接受这些三角洲,请参见下文):

每个点:
1.找到相对于轴的点的距离。
2.找到相对于轴的点的当前角度。
3.使用基本的2-D COS/SIN Polar投影,因为排除的轴是单位向量。

function rotateY( points, deltaAngle ) {
    const _points = points;
    if ( ! Array.isArray( points ) ) points = [ points ];
    for ( let i = 0; i < points.length; i ++ ) {
        const newAngle = Math.atan2( points[ i ].z, points[ i ].x ) + deltaAngle;
        const distance = ( points[ i ].x ** 2 + points[ i ].z ** 2 ) ** ( 1 / 2 );
        points[ i ].x = distance * Math.cos( newAngle );
        points[ i ].z = distance * Math.sin( newAngle );
    }
    return _points;
}

对于x和z旋转的算法是相同的,只要Math.atan2中使用的第一个轴是使用Math.sin的轴。

注意:我使用了指示操作员。除非您使用Babel/类似的东西或不关心IE/Old用户,否则我不会在生产中使用它。


如果不能采取假设ii),我们只想存储点的原始角度,并将newAngle定义为原始角度加上新角度。

如果假设i)无法采取,则会变得复杂。如果对象的轴简单地偏移,则可以在newAngledistance中减去该偏移,并在设置xz时将其添加回去。如果轴本身与全局轴不平行,则需要切换到使用四元组,以避免摄影锁。我建议复制或至少要查找三。

最新更新