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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0315
竹糸HGIMG3でのカメラ設定について6解決


竹糸

リンク

2009/3/15(Sun) 02:23:24|NO.23892

HGIMG3のカメラ設定について質問させて頂きたいのですが、
「カメラを傾けても1つの物体を見続ける」といった動作がうまく行きません。
以下のソースはカーソルキーでカメラを傾けるものなのですが、
カメラをX方向、Y方向の両方に傾けると物体がY方向にのみずれてしまいます。
X方向は中心を保っているので理想通りなのですが…


#include "hgimg3.as" #const pi 3.14159265 hgini ;オブジェクト配置 setcolor 255,255,255 addbox model,30,30 regobj obj,model ;カメラの高さ mytall=100.0 *main ;カメラ設定 setang HGOBJ_CAMERA,-pi/2+atan(dy,mytall),0.0,-atan(dx,mytall) setpos HGOBJ_CAMERA,dx,-mytall,dy ;カメラ移動 stick key,15 if key&1 : dx-=5 if key&2 : dy-=5 if key&4 : dx+=5 if key&8 : dy+=5 hgdraw hgsync 16 goto *main

X方向と同じように式を書いているので式が間違っていることは無いと思うのですが、
かといって他に原因も見当たらず困っています。
どうすれば物体を中心に保ったまま傾けることが出来るのでしょうか。
ご回答頂けるとありがたいです。



この記事に返信する


ヒカリ

リンク

2009/3/15(Sun) 14:24:31|NO.23908

ちょっと中途半端なアドバイスですが、
-pi/2+atan(dy,mytall) の部分には dx の影響が、
-atan(dx,mytall) の部分には dy の影響が、それぞれないのが原因かと思います。

具体的にどうすればいいのかが思いつきませんでした……。
d3module あたりを参考にすれば、何か見つかるかも。


ちなみに、カメラのdirグループの情報は使わないのですか?
cammode と組み合わせれば、常に任意の座標を注視できますけど…。

なにかの都合でそれが使えない場合は、fvface という命令もあります。
自分で演算をプログラムするよりも、こちらを使う方が楽だと思いますよ。



竹糸

リンク

2009/3/15(Sun) 18:01:53|NO.23916

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

>-pi/2+atan(dy,mytall)の部分には dx の影響
やはりそこら辺が怪しいですね…
fvfaceがうまく使えなければ、d3moduleを見つつ頑張ってみたいと思います。

>ちなみに、カメラのdirグループの情報は使わないのですか?
これを使うとカメラの回転が1つ使えなくなってしまうので…
今回は使わない方向で行くつもりでした。

>fvface という命令
使ってみたのですがー…


;カメラ設定 fvset fv,dx,-mytall,dy fvface fv,0,0,0 setang HGOBJ_CAMERA,fv.0,fv.1,fv.2 setpos HGOBJ_CAMERA,dx,-mytall,dy title ""+fv.0+":"+fv.1+":"+fv.2

カメラ設定の部分をこのように書き換えたところ、映りすらしなくなってしまいました^^;
とりあえずfv.0は-π/2であって欲しいのでπを足したりマイナスをかけてみたりしたのですが、
当然そんな強引な方法では正しく動くわけも無く…
特にfv.1の値が0からπ/2に飛んだりして理解が及びません…
そもそもfvfaceの使い方が間違っているのでしょうか?

引き続きどうかご教授頂けると幸いです。



ヒカリ

リンク

2009/3/15(Sun) 19:01:27|NO.23918

もう一歩でしたね……。
hgimg3の妙な「Y方向の仕様」のためか、カメラ設定の部分を

setang HGOBJ_CAMERA, -fv.0, -fv.1, -fv.2
と書けば、幸せがひとつ増えるはずですd^^

動作確認の時に座標の方向が分かりにくくなるので、
boxオブジェクトをX方向に4、5個並べると見やすくなりますよ。



竹糸

リンク

2009/3/15(Sun) 22:32:13|NO.23932

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

>setang HGOBJ_CAMERA, -fv.0, -fv.1, -fv.2
マイナスをつけるだけだったのですね…

これで理想通りに動く…!と思ったのですが、少々違うようです^^;

この仕様でも構わないのですが、最初に私が載せたものでは物体を向こうから見る時に、
体を向こうに伸ばした状態から見るような仕様になっているのに対し、
こちらの仕様では完全に立ち位置を反対にして見ています。
言葉で表現しにくかったので画像を…
http://www1.axfc.net/uploader/Img/so/39996.jpg

setangの値を色々いじれば何とかなるかと思ったのですが、案の定そう簡単に出来るものでもなく…。
可能でしたらこの問題についても知恵をお貸し頂けると幸いです…。

とりあえず横から見る、ということは出来たので本題は解決とさせていただきます。



ヒカリ

リンク

2009/3/16(Mon) 18:56:05|NO.23944

向こう側にって……そんなの聞いたことない! ><;
でも、ちょっと考えてみました
if dy < 0 : fv.0 = pi-fv.0 : fv.1 += pi
…この式を setang のひとつ前に書けば、一応…理想の見え方になるはずです。
物体の向こう側(Z-方向)から見た時のみ、追加で処理を行ってます。

なんかもうすでに付け焼刃の域に足を踏み入れてる感がいなめませんが……。
(動作もカメラが1回転するし……)



竹糸

リンク

2009/3/16(Mon) 20:35:44|NO.23947

ご回答ありがとうございます。
折角考えてくださったところ申し訳ないのですが、動作が少々違うようです^^;

最初のatanの計算を考え直したところ、以下のようになりました。

#include "hgimg3.as" #const pi 3.14159265 hgini ;オブジェクト配置 setcolor 255,255,255 addbox model,10,10 repeat 9 regobj obj,model setpos obj,(cnt\3-1)*30,0,(cnt/3-1)*30 loop ;カメラの高さ mytall=100.0 *main ;カメラ設定 setang HGOBJ_CAMERA,atan(-sqrt(dx*dx+mytall*mytall),dy),0.0,-atan(dx,mytall) setpos HGOBJ_CAMERA,dx,-mytall,dy ;title ""+fv.0+":"+fv.1+":"+fv.2 ;カメラ移動 stick key,15 if key&1 : dx-=5 if key&2 : dy-=5 if key&4 : dx+=5 if key&8 : dy+=5 hgdraw hgsync 16 goto *main

カメラが回転するのが酔いの原因になるかと思いまして、このような動作が出来るといいなーと考えておりました。
言葉で表現しきれず、勘違いさせてしまい申し訳ございません^^;

とはいえやはりヒカリさんの方法が一般的なようですので、そちらをメインに開発させて頂きます。
色々な知識をご教授頂き、ありがとうございました!



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