0

それで、私は 3D プログラミングを学ぼうとしていて、物事がどのように機能するかをよりよく理解するためにいくつかの実験をしようとしています。

私が試していることの 1 つは、(threejs を使用して) 線を描画し、ランダムに回転させることです。

私はマトリックスの男ではありませんでした.私は常に「頭の中で意味をなす」方法で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 コンポーネントが変更されていないため) これは私が考えていたことですが、これはこれを行うスマートな方法でしょうか?

コーヒースクリプト

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?

技術的には、2 つのコンポーネントのローテーションを渡したいと思うことはわかっていますが、3 つのコンポーネントすべてを同じローテーションにすることもできるのではないかと考えました。

4

1 に答える 1

1

点 (2d) の代わりに線を中心に回転するか、四元数を使用する必要があるため、3d での回転は 2d よりも少し複雑です。ここを見て、回転する線に応じた回転行列のさまざまな組み合わせを確認してください。3D 変換には、均一な座標を作成するための 4 x 4 行列が含まれ、回転を作成するには、行列の 3 x 3 部分が必要です。

クォータニオン(特別な種類の数値) を使用して回転を計算することもできます。これは、 »ジンバル ロック«に関するいくつかの問題を解決するため、3D アプリケーションで使用するのに非常に便利です。

于 2013-02-14T07:31:29.330 に答える