HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0322
竹糸HGIMGで視線を軸にカメラを回転させるには10解決


竹糸

リンク

2009/3/22(Sun) 17:42:45|NO.24052

何度も質問申し訳ございません。これで最後の質問となります。

HGIMG3で視線を軸としてカメラを回転させたいのですが、どのようにすればいいのか分かりません。
視線ベクトルを法線ベクトルとする面に対する水平なベクトル?と考えたのですが正しく動かず…

また、根本的な話となってしまうのですがカメラの角度の3つの値がどのような値なのかまだいまいち掴めていません。
見る方向を指定する値が2つと、そのカメラの回転を指定する値が1つ、というのなら分かるのですが、
3つの値を1つ変えるだけで見る方向と、カメラの回転の2つが変化してしまうので理解が及びません…

どちらも自力で調べられるだけ調べては見たのですが、残念ながら手がかりになるページを見つけることが出来ませんでした。
ヒントとなるページや言葉だけでもいいですので、どうかご教授頂けると幸いです。



この記事に返信する


いなえ

リンク

2009/3/23(Mon) 13:57:35|NO.24062

HGIMG3におけるオブジェクトの回転にはangグループの値が用いられます。
その際の法則については、リファレンスの
「・オブジェクトの回転順序設定について」
に記述があります。
addang命令等はangグループの値を変化させますが、
その変化の履歴は保存されません。
HGIMG3は各オブジェクトの今現在のangグループの値を用い、
法則に従って回転させたオブジェクトを表示します。
この法則はカメラオブジェクトについても適用されます。
カメラオブジェクトは他のモデルのデフォルト同様、
Z→Y→Xの順に回転が行われます。
カメラにはモデルの指定方法がないので、
この回転順序を変更する方法はないものと思われます。
試しに次のスクリプトでZ→Y→Xの順に回転角を変更すると
全く違和感のない回転を体験することができます。

#include "hgimg3.as" screen 0,640,480 hgini //ランダムにBOXオブジェクトを配置 setcolor $CC,$FF,$CC addbox boxModel,1,1 repeat 500 regobj box,boxModel setpos box,rnd(200)-100,rnd(200)-100,rnd(200)-100 loop //カメラの位置を原点に変更 setpos HGOBJ_CAMERA *main //キー入力取得 stick ky,15,0 getkey xKey,88 getkey zKey,90 //スペースキーで回転角を初期化 if ky&16:setang HGOBJ_CAMERA //[X][Z]でZ回転角変更 if xKey:addang HGOBJ_CAMERA, 0.00, 0.00, 0.05 if zKey:addang HGOBJ_CAMERA, 0.00, 0.00,-0.05 //矢印キー左右でY回転角変更 if ky&1:addang HGOBJ_CAMERA, 0.00, 0.05, 0.00 if ky&4:addang HGOBJ_CAMERA, 0.00,-0.05, 0.00 //矢印キー上下でX回転角変更 if ky&2:addang HGOBJ_CAMERA, 0.05, 0.00, 0.00 if ky&8:addang HGOBJ_CAMERA,-0.05, 0.00, 0.00 //描画 hgdraw hgsync 20 goto *main
ちなみにこの回転について少し考察すると、
各回転段階でのローカル座標系で次の回転を行うものとなっています。
つまりワールド座標系で考えるならば、
逆の順序、すなわちX→Y→Zの順で回転が行われることになります。



とらさん

リンク

2009/3/23(Mon) 18:44:59|NO.24076

それと難しいですが任意軸に関する回転の実現にはクォータニオン(四元数)なんてのが使えます

実行ソースの参考例などが必要でしたら、d3mのモジュールの中を少々覗いてみるのもいいかもしれません



竹糸

リンク

2009/3/23(Mon) 21:29:07|NO.24081

>いなえさん
詳しい説明ありがとうございます。
となると、視点を決める前にカメラを回してしまったほうが早いんでしょうか?
もしそうだとすると視点を求めるプログラムを変更する必要が出てくるので避けたいところですが…

>とらさん
これはまた便利なものですね。
軸を中心とした回転は行えるようになったのですが、
いざ使おうとしたら何の点を回せばいいのか?と悩むことに…

なんてことのない話な気がするのですが、どうやら思考が完全に偏ってしまっているようです^^;
申し訳ありませんが、解決までもう少しだけお時間を下さい。



竹糸

リンク

2009/3/24(Tue) 09:23:26|NO.24085

おはようございます。
昨日からずっと考えてみましたが、答えを出すことが出来ませんでした。
しまいには夢にまで出てきてげんなり…^^;
極力自分で考えますので、もう少しヒントを頂けたらありがたいです。



k

リンク

2009/3/24(Tue) 15:03:19|NO.24094

こんな感じでしょうか〜

中心のボックスからアングルを取得し
ボックスの位置から後退するという方法です。
もっといい方法があるとは思います・・・


#include "hgimg3.as" screen 0,640,480 hgini cammode CAM_MODE_LOOKAT setcolor $CC,$FF,$CC addbox boxModel,2,2 addbox boxModel1,1,1 regobj box,boxModel repeat 100 regobj box1,boxModel1 setpos box1,rnd(100)-50,rnd(100)-50,rnd(100)-50 loop *main stick ky,15 if ky&4 : addangr box, 0,-2 if ky&1 : addangr box, 0,2 selang box objgetfv anc fvmul anc,-1,-1,-1 selpos box objgetfv poc fvdir anc,0,0,50 fvadd poc,anc.0,anc.1,anc.2 ;後退 selcpos objsetfv poc hgdraw hgsync 16 goto *main



竹糸

リンク

2009/3/24(Tue) 21:42:03|NO.24105

>kさん
回答ありがとうございます。
注視点モードを使うことも考えたのですが、注視点モードではカメラを回すことは出来ませんでした…
注視点モードでは現在のカメラの位置から指定された点を見る、ということでcvfaceを使った時と
同じような効果になると思うのですが、それではカメラ本体の回転を行うことが出来ない…
と思っていたのですが出来るのでしょうか。
もしそうであれば大喜びなところなのですが…



k

リンク

2009/3/27(Fri) 15:44:15|NO.24205

>HGIMG3で視線を軸としてカメラを回転させたいのですが

最初 aを3.14159/2 にセットすると
aが上下 c が左右 bが回転軸となり
それらしい挙動が再現できますねー


#include "hgimg3.as" screen 0,640,480 hgini cammode CAM_MODE_NORMAL setcolor $CC,$FF,$CC addbox boxModel,2,2 repeat 27 regobj box,boxModel setpos box,(cnt/9-1)*10,((cnt\9)/3-1)*10,(cnt\3-1)*10 loop setpos HGOBJ_CAMERA,0, 0,0 a=3.14159/2 b=0.0 c=0.0 *main stick ky,63 if ky&2 : b+=0.02 if ky&8 : b-=0.02 ; if ky&16 : a+=0.02 ; if ky&32 : a-=0.02 if ky&1 : c+=0.02 if ky&4 : c-=0.02 setang HGOBJ_CAMERA,a,b,c hgdraw hgsync 16 goto *main



いなえ

リンク

2009/3/27(Fri) 16:44:08|NO.24207

下の参考ページを見て実現することができました。
思い通りの処理を自力で作成するには行列の知識が必須です。
極力自分で考えますとのことなのでスクリプトは投稿しません(長いですし)。
方法は概ね以下の通り。

1. 回転させたいオブジェクト(カメラでもOK)の回転角(オイラー角)をgetangで取得
2. ローカル座標系におけるz軸方向単位ベクトルをワールド座標に変換(ちなみにカメラの視線はz軸負の向き)
3. オブジェクトの現在の回転(オイラー角による回転)を回転行列に変換(Aとする)
4. 2.で求めたベクトルを軸とする回転を四元数で表現
5. 4.の四元数を回転行列に変換(Bとする)
6. C=BA(行列の積)
7. 回転行列Cをオイラー角に分解(このオイラー角が求めるオブジェクトの回転角)

ちなみにいきなり実装しようとするとまず失敗すると思います。
まずはオブジェクトの回転順序や方向、座標系についてしっかり理解してからどうぞ。
もし行列を知らなかったらその学習が先決です。

参考:
http://yaneu.com/yaneurao/3dcg/funda01.html



GENKI

リンク

2009/3/27(Fri) 20:24:41|NO.24209

なにやら変換マトリクスの話になってるようなので宣伝に来ました。

こいつで「任意の軸を中心に回転」して変換マトリクス算出とかできます。
http://homepage3.nifty.com/ghpk/dl/dl14.htm
平行移動入れてないので3*3行列ですが、問題ないでしょう。

回転行列の分解なんて出来たんですね。
知りませんでした…というか思いつきすら出来なかったです。



竹糸

リンク

2009/3/28(Sat) 01:30:49|NO.24215

皆さんご回答ありがとうございます。

>kさん
残念ながら最初だけですねー…
そこから基準にaがπ/2でない時の計算を考えれば近い挙動に出来そうですが。

>いなえさん
分かりやすい説明ありがとうございます!
行列に関しては1年ほど前に習ったばかりなので問題ないと思います。
頑張ってスクリプトを組んでみたいと思います。

>GENKIさん
これは便利なモジュールですね!
行列の話ということで関数作りから細かくやろうと思っていましたが、大分手間が省けそうです。

皆さんのおかげでようやく実現することが出来そうです。
後は気合で何とか頑張ってみたいと思います。
ご教授して頂いた皆様、ありがとうございました!



ONION software Copyright 1997-2021(c) All rights reserved.