三维旋转算法

3D Rotation Algorithm

本文关键字:算法 旋转 三维      更新时间:2023-09-26

所以我正在尝试学习一些3D编程,并尝试做一些实验来更好地理解事物是如何工作的。

我正在尝试的一件事是(用三个js)画一条线并随机旋转。

我从来都不是一个矩阵人,我总是以2D的方式做事,这在我的脑海中是有意义的

# CoffeeScript
get_angle:->
  Math.atan2(@props.velocity[1],@props.velocity[0])
rotate:(amount)->
    ang = @get_angle()
    mag = @get_speed()
    # props is a velocity vector, [0] is x and [1] is y
    @props.velocity[0] = Math.cos(ang+amount)*mag
    @props.velocity[1] = Math.sin(ang+amount)*mag

传入的金额是随机的。。。生成随机"行走"

我现在想知道我怎么能在3d中做同样的事情?现在应用程序运行良好(我看到了我的行),但它是"平坦的"。没有深度(由于Z组件没有被修改)这就是我想做的,这是一个明智的方式吗?

CoffeeScript

get_angle:->
    Math.atan2(@props.velocity[1],@props.velocity[0])
get_angle2:->
    # not sure about this, but I feel like I need to be finding the angle from the z now and something else.
rotate:(amount)->
    ang = @get_angle()
    ang2 = @get_angle2()
    mag = @get_speed()
    # props is a velocity vector, [0] is x and [1] is y
    @props.velocity[0] = Math.cos(ang+amount)*mag
    @props.velocity[1] = Math.sin(ang+amount)*mag
    @props.velocity[2] = # I have a feeling here I would do something with ang2 and amount?

我知道从技术上讲,我可能想让其中两个组件的旋转通过,但我想也许我可以试着让它对所有三个组件都进行相同的旋转。

3d中的旋转比2d中的旋转要复杂一些,因为你必须绕线旋转,或者使用四元数,而不是点(2d)。看这里可以看到旋转矩阵的不同组合,这取决于你旋转的线。三维变换包括四乘四矩阵来创建齐次坐标,并且需要矩阵的三乘三部分来创建旋转。

你也可以使用四元数(特殊类型的数字)来计算旋转,这在三维应用中非常方便,因为它解决了一些关于"万向锁"的问题。