トップページ > 記事閲覧
3Dで地球儀
名前:ao 日時: 2013/06/24 22:44

DXライブラリには大変お世話になっています。ありがとうございます。 ところでRPGゲームを作っているのですが、冒険するマップを、3Dの地球儀にしたいと思っています。 地球儀データ自体はなんとか用意するとして、 「海の上は歩けない」 「ここの点に乗ったらさらに小さい別のマップに移動」 などの操作をどう実現しようかと考えています。 そこで、表示するカラフルな3D地球儀とは別に、内部にもうひとつ白黒の地球儀を用意してキャラクターに同じように冒険させ、キャラクターが乗っているところが白だったら通行可能。黒なら通行不可などにしたいのです。 今回お伺いしたいことは、 1、3Dモデルの指定点の色を取得するにはどうしたらよいでしょうか。 2、この方法以外に、もし案がありましたらお聞かせください。 の二つです。 ご教授お願いいたします。
メンテ

Page: 1 |

Re: 3Dで地球儀 ( No.1 )
名前:Sura 日時:2013/06/25 01:33

2の方法で申しあげる事となるでしょうが、 基本、3次元直交座標系で処理したほうが良いような気がします。以下それを前提に。 地球儀上の、陸地と海の境界付近に境界点を設け、その点を中心とした半径(1ステップに移動する程度の距離)内に、 オブジェクトの移動先の座標があれば境界に接していると判断し移動を禁ずる。それを境界球とする。 何らかの転送地点も、半径の大きさを適宜調整すれば、その応用でできると思います。 そして、境界上にその半径未満の間隔で境界球を設置する (※処理速度の兼ね合いで単純な足し算による8面体として判断するのも良いかと)。 また、地球儀即ち球面上を直線に移動するということは、 大円(地球儀の中心をとおる平面による断面の淵)を必ず通ることになるので、 その平面の法線方向を軸とした回転によって表現が可能です。 このような回転方法は四元数の積を利用して計算できます。 回転される座標 : p(0;x,y,z) 回転軸 : u(0;a,b,c) -> (a,b,c)は単位ベクトル 回転角 : θ -> 回転軸の矢先から見て反時計回り 変換四元数 : q(cosθ/2;a*sinθ/2,b*sinθ/2,c*sinθ/2), ~q(cosθ/2;-a*sinθ/2,-b*sinθ/2,-c*sinθ/2) 回転後の座標 : p' = q * p * ~q このθを境界球の半径程度にすれば実現できそうだと思います。
メンテ
Re: Suraさん ( No.2 )
名前:ao 日時:2013/06/25 02:31

返信ありがとうございます。 正直言ってモデリングのソフトにもまだ触れていない私にとって、 3Dの球形に対し、色を塗る(画像を貼り付ける?)だけでも「どうするんだろうなー」という状態で、 それ以上の処置は想像も及びません。 写真を貼り付けたような表面にしようと考えているのですが、 海と陸の複雑な境界線の座標を手作業ですべて指定するって、ちょっと膨大そうですね… 色でまとめられれば楽だったのですが… それしかないようだったらそうしようと思います。 ちなみに、 おっしゃってくださったように、 キャラクターアイコンを画面の中心に配置して真上から俯瞰し、 球を回転させることで移動を表現したいと考えていました。
メンテ
Re: 3Dで地球儀 ( No.3 )
名前:Sura 日時:2013/06/25 22:57

>色でまとめられれば楽だったのですが… リアルタイムでの色の取得は、色の深度やパレットなどの形式云々などにより、 コストが高いと記憶します。 2DでGetPixelという関数がありますが、 以下のURL(ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph0.html#R2N6) にもその旨が書かれています。 従って、ツールなどを用意して境界データをあらかじめ用意するほうが良いような気がします。 テクスチャの元画像をラプラシアンフィルタをかけて境界(即ちエッジ部分)を抽出する。 エッジ部分を局所的に回帰直線を求め、折れ線を求める。 折れ線上に境界点を設置する。間隔は∝(r^2-cos^2(経度))^(-1/2)に調整する。 機械的に大まかにやるには、以上のような方法でしょうか。
メンテ
Re: 3Dで地球儀 ( No.4 )
名前:ao 日時:2013/06/26 05:14

なるほど、モデルデータのほうに加工を入れるわけですね。 GetPixelの重さの程度を見てどちらか決めようと思います。 あとすいません、モデルに打った点の座標を得る方法を教えていただけませんか。 点を設置する作業はもう元画像加工の段階ではないですよね?
メンテ
Re: 3Dで地球儀 ( No.5 )
名前:Sura 日時:2013/06/26 22:50

勿論、最終的には直交座標として準備する物ですが、 元画像が、単純に横軸に経度、縦軸に緯度(且つ等間隔)であれば、 球座標->直交座標への変換になりますので、弧度法で x = r * sin(緯度) * cos(経度) y = r * sin(緯度) * sin(経度) z = r * cos(緯度) 経度の範囲は 0°(0)〜 360°(2π) 緯度の範囲は 0°(0)〜 180°(π) ですので、求めた球座標における境界点を上記の変換によって、求めればいいです。 ちなみに、画像の座標は左上が(0,0)ですから縦軸の位置を反転し、 横は(0〜2π)、縦は(0〜π)になるように1ピクセルの縦横長を調整する。 メルカトル図法では、緯度の目盛りは等間隔ではないので、目盛りを補正する必要があります。
メンテ
Re: 3Dで地球儀 ( No.6 )
名前:ao 日時:2013/06/28 11:46

ありがとうございます しかし、変換前の座標は手作業で得るんですね… がんばってみます
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存