Javascript 在三维空间中旋转后计算顶点位置

Javascript 在三维空间中旋转后计算顶点位置,javascript,math,3d,rotation,trigonometry,Javascript,Math,3d,Rotation,Trigonometry,我尝试在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 -

我尝试在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;
  }
}
函数旋转(金额){
对于(变量i=0;i
它在旋转,但每次旋转都会改变它的x和z比例,所以它会变薄。。你能帮我把它转好吗?谢谢:)

假设i)旋转分别对应于全局原点,而不是对象本身,ii)您希望应用三角形(如果我们无法获取这些,请参见下文):

对于每个点:
1.找到点相对于轴的距离。
2.找到点相对于轴的当前角度。
3.使用基本的二维cos/sin,因为排除的轴是一个轴

函数旋转(点、三角角){
常数点=点;
如果(!Array.isArray(points))points=[points];
for(设i=0;i
只要
Math.atan2
中使用的第一个轴与
Math.sin
中使用的轴相同,X和Z旋转的算法相同

注意:我使用了。我不会在生产中使用它,除非你正在使用/类似的东西或不关心IE/老用户


如果无法采用假设ii),我们只需存储点的原始角度,并将
newAngle
定义为原始角度加上新角度


如果假设i)不能被接受,它就会变得复杂。如果对象的轴只是偏移,则可以在
newAngle
distance
中减去该偏移,并在设置
x
z
时将其加回去。如果轴本身不分别平行于全局轴,则需要切换到使用以避免。我建议复制或至少看一看。

但还有一个问题,你说的常数距离是什么意思?什么之间的距离?从y轴开始。假设你有点{x:1,y:6,z:0},距离y轴的距离是1。因为轴是单位向量,所以你可以想象三维全局空间和该空间的一个片段,定义为y=6,因为平面{x:1,y:6,z:0}位于其中。在这个平面上,{x:1,z:0}距离原点1个单位。
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;

}