コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
More10 ◆J1/MCFrfgp6.
2018/11/9 22:15
質問
3Dポリゴン表示の仕組み
基礎から実際に簡単な物を動かすまで教えてくれると助かります。4が出たら3Dに手を出してみたいなーなんて思ったり。

コメント

アバター
こういち 2018/11/10 7:14 ◆ou0jbJnEJ0Kb
基本的な仕組みは
透視投影と言い、
遠くにあるものは小さく描画する
です。
その具体的な式は
点の座標をx,y,zとし、スクリーンのz座標をs、変換後の座標をx',y'とすると、
x'=x*s/z
y'=y*s/z
で表されます。
スクリーンのz座標はカメラで言うところのズームで、大きくなるとズームインします。
アバター
More10 2018/11/10 14:49 ◆J1/MCFrfgp6.
とりあえずは理解したのですが、そこからカメラの角度、位置を動かすにはどうすればいいですか?
アバター
SatoshiMcCloud 2018/11/10 15:08 ◆Z1qfV11i63Jr
表示したいもの全てが一斉に同じ方向に同じだけ移動すれば、あたかもカメラが動いたように見えます。
アバター
HUCU 2018/11/10 16:03 ◆B7lOIJDWuOqi
STSMKRUD兄貴のPLANE2SOLIDは凄かったゾ…
アバター
こういち 2018/11/10 16:28 ◆ou0jbJnEJ0Kb
カメラを回転、移動させるときは、カメラのx,y,z方向の単位ベクトルを用意して、
物体座標とカメラ座標の位置ベクトルとの内積をとるとカメラ座標系に変換されます。
アバター
More10 2018/11/10 16:42 ◆J1/MCFrfgp6.
>>こういちさん

すみません、調べたのですがベクトルと内積の意味がよく分かりませんでした。良ければ簡単に説明してくれませんか?
アバター
くらげ 2018/11/10 17:42 ◆wwGQuv.PrBB8
大きさと向きを持った量なんて言われてもねぇ…
自分には分かりませんヨオオオオオ
アバター
こういち 2018/11/10 19:03 ◆ou0jbJnEJ0Kb
ベクトルは大きさと向きを持つ量。つまり矢印です。
特に位置ベクトルは座標の差と思うと分かりやすいかも。
物体座標とカメラ座標の位置ベクトルって言ったらカメラの座標から物体の座標までの矢印って意味かな。
単位ベクトルは大きさが1のベクトルであります。
内積はベクトル同士の掛け算のうちの1つです。
特に任意のベクトルと単位ベクトルの内積をとるとそのベクトルの単位ベクトル方向の大きさが得られます。
アバター
おちゃめ 2018/11/10 20:44 ◆jH1opV6FnGyx
3Dポリゴン表示は仕組みさえ分かればそれほど難しくはないのですが、初心者にとっては乗り越えなければいけない壁も少なくありません。
だから、ポリゴン表示プログラムよりもハードルが低いワイヤーフレーム表示プログラムにまずは挑戦してみてはいかがでしょうか。

ワイヤーフレームでは線(GLINE)によって立体を表現しますが、ポリゴンではそれが面(GTRI)に変わるだけです。その面の表示をする際にベクトルの内積や外積が必要になるためワイヤーフレームであればベクトルの知識が無くても作ることができます。
したがって、ワイヤーフレームは回転処理を行わなければ初心者でも簡単に作ることができます。(回転を行う場合は行列の知識が必要だけど公式通りに作ればいいのでそれほど難しくはない)

ちなみに私が作ったプチコン3号本「プチコン3号 3Dポリゴン入門」(上記写真参照)では、まず最初にスプライトを使った擬似3D表示プログラムから入り、それをワイヤーフレーム表示プログラムへとつなげてポリゴン表示プログラムへと発展させています。

プチコンmkII用のポリゴン表示プログラムであれば私のサイトにプログラムリストとその解説を記述しています。
http://ochameclub.web.fc2.com/petitcom/polygon.htm
アバター
みなつ 2018/11/17 9:36 ◆hJTkStjweib1
ベクトルというのは、複数の値をセットとして扱う表現で、2次元ならX方向の大きさとY方向の大きさのセット、3次元なら、さらにZ方向の大きさもひっつけたものです。
例えば、X方向に5、Y方向に8、Z方向に10の大きさの3次元ベクトルは(5,8,10)と書きます。つまり、こういちさんが書かれているように、矢印の大きさを表したものですねー。
ただ、プチコンではベクトルを直接扱う機能は無いので、それぞれの成分をべつべつの変数に入れておきます。

それなら、座標で扱うのと同じじゃん!と思われるかも知れませんし、実際、プログラムにしてしまうとほとんどその通りなのですが、ベクトルで考えると「内積(あるベクトルの方向への大きさを計算できる)」とか「外積(2つのベクトルに直交するベクトルを計算できる)」という便利な計算ができちゃうのです。ここでは、こういちさんが書かれているとおり、カメラ座標への変換に使う「内積」のほうを紹介します。

まず、
変換したい座標P:(X,Y,Z)
カメラの位置C:(CX,CY,CZ)
とすると、カメラから座標PへのベクトルCP(カメラを基準としたPの相対位置)は
CP=(X-CX, Y-CY, Z-CZ)と計算できます。CPの成分をCPX,CPY,CPZとして、成分で書き直すと、
CPX=X-CX
CPY=Y-CY
CPZ=Z-CZ
となります。

ここで、カメラの右手方向の単位ベクトルRを(RX,RY,RZ)とすると、CPのR方向への大きさX_camは、内積(・という記号で表します)を使って
X_cam=CP・R=CPX*RX+CPY*RY+CPZ*RZ
と計算できます。このように内積は、それぞれのベクトルの成分を掛けて全部足すという計算なんですねー。簡単〜(*´▽`*)

ちなみに単位ベクトルは、大きさ(長さ)1のベクトルです。ベクトルの大きさは、成分の2乗を全部足してルートをとったものです。2次元なら、ピタゴラスの定理です。

あとは、
カメラの上方向の単位ベクトル:(UX,UY,UZ)
カメラの奥方向の単位ベクトル:(FX,FY,FZ)
とすると、カメラの上方向、奥方向への大きさは、同様に
Y_cam=CPX*UX+CPY*UY+CPZ*UZ
Z_cam=CPX*FX+CPY*FY+CPZ*FZ
と計算できます。

これで、「カメラから見たときの座標X_cam, Y_cam, Z_cam」が計算できたので、この座標を、こういちさんが最初に投稿されている透視投影で描画すれば、カメラから見たときの3D表示ができちゃいます(≧∇≦)b

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -