Javascript 三维旋转算法

Javascript 三维旋转算法,javascript,3d,coffeescript,three.js,matrix-multiplication,Javascript,3d,Coffeescript,Three.js,Matrix Multiplication,因此,我正在尝试学习一些3D编程,并尝试做一些实验来更好地理解事物是如何工作的 我正在尝试的一件事是(使用threejs)画一条线并随机旋转它 我从来不是一个黑客帝国的人,我总是用“在我的头脑中有意义”的方式在2D中做事 传入的数量是随机的。。。生成随机“行走” 我现在想知道如何在3d中也能做到这一点?现在应用程序运行良好(我看到了我的行),但它是“平坦的”。没有深度(因为Z组件没有被修改) 这就是我想做的,这是一种聪明的方式吗 咖啡脚本 我知道,从技术上讲,我可能希望通过两个组件的旋转,但我想

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

我正在尝试的一件事是(使用threejs)画一条线并随机旋转它

我从来不是一个黑客帝国的人,我总是用“在我的头脑中有意义”的方式在2D中做事

传入的数量是随机的。。。生成随机“行走”

我现在想知道如何在3d中也能做到这一点?现在应用程序运行良好(我看到了我的行),但它是“平坦的”。没有深度(因为Z组件没有被修改) 这就是我想做的,这是一种聪明的方式吗

咖啡脚本
我知道,从技术上讲,我可能希望通过两个组件的旋转,但我想也许我可以尝试让它对所有三个组件进行相同的旋转。

三维旋转比二维旋转更复杂,因为你必须绕线旋转,而不是点(2d),或者使用四元数。查看旋转矩阵的不同组合,具体取决于旋转的直线。三维变换涉及四乘四矩阵以创建齐次坐标,需要矩阵的三乘三部分来创建旋转


您还可以使用(特殊类型的数字)来计算旋转,这在3d应用程序中非常方便,因为它解决了与»«有关的一些问题。

由于万向节锁定问题,您不使用四元数(但当然四元数不锁定,因为它们没有万向节)。使用四元数是因为它们形成的空间在旋转空间中是一致的。而欧拉旋转则不是。非均匀映射导致万向节锁等问题,但它远不是最常见的问题(但它是一个过度宣传的原因)。相反,使用四元数的原因是插值很容易,并且使用正常的线性空间规则。例如,可以使用轴角度,它们更有意义,但更难插值。
# 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
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?