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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0211
WHITEhgimg3で任意の軸回転5解決


WHITE

リンク

2011/2/11(Fri) 11:20:02|NO.37008

hgimg3ではオブジェクトの回転はオイラー角で行なわれてしまい任意の軸の回転ができません。
そこでいなえさんのhgimg3講座の任意の軸回転を参考にいろいろやってみたのですが、
オブジェクト座標系(ローカル座標系?)での移動や回転はどのようにすればいいのでしょうか。

やりたいことは2つ。
・オブジェクトの軸での回転
・オブジェクトの軸での平行移動
がやりたいです。
つまりはフライトシムのようなピッチやバンクやスライドがしたいわけです。

説明下手でもうしわけありません;
おねがいします。



この記事に返信する


f3d

リンク

2011/2/11(Fri) 19:22:48|NO.37013

クオータニおンを使ってはどうでしょうか?
クオータニンとは三次元ベクトルとその軸を中心とした回転です。



WHITE

リンク

2011/2/11(Fri) 22:28:58|NO.37017

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

四元数ですね。はい、行列を使って回転行列をつくり、姿勢行列を変換しオイラー角を抽出
することを試みたのですがなかなか思い通りの回転をしてくれません。

いなえさんの方法でやってみたのですがどうもおもいえがいていたものとちがい、
任意の軸での回転ということなので物体の向いてる方向を向いてる軸ベクトルをオイラー角
もしくは姿勢行列からつくればいいとおもったんですがそれがなかなかやりかたがわからな
いのです;;



WHITE

リンク

2011/2/11(Fri) 23:19:54|NO.37018

追記

d3moduleのといなえさんの方法をてきとうに組み合わせてやってみました。。。
やっぱ思い通りにいかない・・・

カーソルキー↑↓でピッチ、←→でヨー、QEでバンクです


#include "hgimg3.as" #include "d3m.hsp" screen 0, 640, 480 hgini addbox pyro, 1.0, 1.0 regobj pyro_o, pyro cammode CAM_MODE_LOOKAT ddim matrix, 9 matrix.0 = 1.0 : matrix.1 = 0.0 : matrix.2 = 0.0 matrix.3 = 0.0 : matrix.4 = 1.0 : matrix.5 = 0.0 matrix.6 = 0.0 : matrix.7 = 0.0 : matrix.8 = 1.0 x = 0.0 y = 0.0 z = 0.0 selcpos objsetf3 0.0, 0.0, 5.0 selcint objsetf3 0.0, 0.0, 0.0 while hgdraw getkey key_up, 38 getkey key_down, 40 getkey key_left, 37 getkey key_right, 39 getkey key_bankLeft, 81 getkey key_bankRight, 69 getkey key_slideForward, 87 getkey key_slideBackward, 83 getkey key_slideLeft, 65 getkey key_slideRight, 68 if( key_left = 1 ){ //pitch //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.0, matrix.1, matrix.2, 0.1 //d3vrotate matrix.6,matrix.7,matrix.8, matrix.6,matrix.7,matrix.8, matrix.0, matrix.1, matrix.2, 0.1 //yaw d3vrotate matrix.6, matrix.7, matrix.8, matrix.6, matrix.7, matrix.8, matrix.3, matrix.4, matrix.5, 0.1 d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.3, matrix.4, matrix.5, 0.1 //bank //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.6, matrix.7, matrix.8, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.6, matrix.7, matrix.8, 0.1 if absf(matrix(6))=1.0{ tx=atan(matrix(2),matrix(1)) tz=0.0 ty=-atan(1,0)*matrix(6) } else{ tx=atan(-matrix(7),matrix(8)) tz=atan(-matrix(3),matrix(0)) ty=-atan(matrix(6),matrix(0)/cos(tz)) } setang pyro_o, tx, ty, tz } if( key_right = 1 ){ //pitch //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.0, matrix.1, matrix.2, 0.1 //d3vrotate matrix.6,matrix.7,matrix.8, matrix.6,matrix.7,matrix.8, matrix.0, matrix.1, matrix.2, 0.1 //yaw d3vrotate matrix.6, matrix.7, matrix.8, matrix.6, matrix.7, matrix.8, matrix.3, matrix.4, matrix.5, -0.1 d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.3, matrix.4, matrix.5, -0.1 //bank //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.6, matrix.7, matrix.8, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.6, matrix.7, matrix.8, 0.1 if absf(matrix(6))=1.0{ tx=atan(matrix(2),matrix(1)) tz=0.0 ty=-atan(1,0)*matrix(6) } else{ tx=atan(-matrix(7),matrix(8)) tz=atan(-matrix(3),matrix(0)) ty=-atan(matrix(6),matrix(0)/cos(tz)) } setang pyro_o, tx, ty, tz } if( key_up = 1 ){ //pitch d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.0, matrix.1, matrix.2, -0.1 d3vrotate matrix.6,matrix.7,matrix.8, matrix.6,matrix.7,matrix.8, matrix.0, matrix.1, matrix.2, -0.1 //yaw //d3vrotate matrix.6, matrix.7, matrix.8, matrix.6, matrix.7, matrix.8, matrix.3, matrix.4, matrix.5, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.3, matrix.4, matrix.5, 0.1 //bank //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.6, matrix.7, matrix.8, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.6, matrix.7, matrix.8, 0.1 if absf(matrix(6))=1.0{ tx=atan(matrix(2),matrix(1)) tz=0.0 ty=-atan(1,0)*matrix(6) } else{ tx=atan(-matrix(7),matrix(8)) tz=atan(-matrix(3),matrix(0)) ty=-atan(matrix(6),matrix(0)/cos(tz)) } setang pyro_o, tx, ty, tz } if( key_down = 1 ){ //pitch d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.0, matrix.1, matrix.2, 0.1 d3vrotate matrix.6,matrix.7,matrix.8, matrix.6,matrix.7,matrix.8, matrix.0, matrix.1, matrix.2, 0.1 //yaw //d3vrotate matrix.6, matrix.7, matrix.8, matrix.6, matrix.7, matrix.8, matrix.3, matrix.4, matrix.5, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.3, matrix.4, matrix.5, 0.1 //bank //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.6, matrix.7, matrix.8, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.6, matrix.7, matrix.8, 0.1 if absf(matrix(6))=1.0{ tx=atan(matrix(2),matrix(1)) tz=0.0 ty=-atan(1,0)*matrix(6) } else{ tx=atan(-matrix(7),matrix(8)) tz=atan(-matrix(3),matrix(0)) ty=-atan(matrix(6),matrix(0)/cos(tz)) } setang pyro_o, tx, ty, tz } if( key_bankLeft = 1 ){ //pitch //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.0, matrix.1, matrix.2, 0.1 //d3vrotate matrix.6,matrix.7,matrix.8, matrix.6,matrix.7,matrix.8, matrix.0, matrix.1, matrix.2, 0.1 //yaw //d3vrotate matrix.6, matrix.7, matrix.8, matrix.6, matrix.7, matrix.8, matrix.3, matrix.4, matrix.5, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.3, matrix.4, matrix.5, 0.1 //bank d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.6, matrix.7, matrix.8, 0.1 d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.6, matrix.7, matrix.8, 0.1 if absf(matrix(6))=1.0{ tx=atan(matrix(2),matrix(1)) tz=0.0 ty=-atan(1,0)*matrix(6) } else{ tx=atan(-matrix(7),matrix(8)) tz=atan(-matrix(3),matrix(0)) ty=-atan(matrix(6),matrix(0)/cos(tz)) } setang pyro_o, tx, ty, tz } if( key_bankRight = 1 ){ //pitch //d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.0, matrix.1, matrix.2, 0.1 //d3vrotate matrix.6,matrix.7,matrix.8, matrix.6,matrix.7,matrix.8, matrix.0, matrix.1, matrix.2, 0.1 //yaw //d3vrotate matrix.6, matrix.7, matrix.8, matrix.6, matrix.7, matrix.8, matrix.3, matrix.4, matrix.5, 0.1 //d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.3, matrix.4, matrix.5, 0.1 //bank d3vrotate matrix.3, matrix.4, matrix.5, matrix.3, matrix.4, matrix.5, matrix.6, matrix.7, matrix.8, -0.1 d3vrotate matrix.0,matrix.1,matrix.2, matrix.0,matrix.1,matrix.2, matrix.6, matrix.7, matrix.8, -0.1 if absf(matrix(6))=1.0{ tx=atan(matrix(2),matrix(1)) tz=0.0 ty=-atan(1,0)*matrix(6) } else{ tx=atan(-matrix(7),matrix(8)) tz=atan(-matrix(3),matrix(0)) ty=-atan(matrix(6),matrix(0)/cos(tz)) } setang pyro_o, tx, ty, tz } // setang pyro_o, 0.0, angle_theta, 0.0 if( key_slideUp = 1 ){ y -= 0.5 } if( key_slideDown = 1 ){ y += 0.5 } if( key_slideForward = 1){ x = x - sin( angle_theta )* 0.5 z = z - cos( angle_theta )* 0.5 } if( key_slideBackward = 1){ x = x + sin( angle_theta )* 0.5 z = z + cos( angle_theta )* 0.5 } if( key_slideLeft = 1){ x = x + sin( angle_theta - M_PI/2.0 )* 0.5 z = z + cos( angle_theta - M_PI/2.0 )* 0.5 } if( key_slideRight = 1){ x = x + sin( angle_theta + M_PI/2.0 )* 0.5 z = z + cos( angle_theta + M_PI/2.0 )* 0.5 } setpos pyro_o, x ,y ,z hgsync 20 wend return


なお行列演算をd3moduleで、描画をhgimg3でおこなっています。



GENKI

リンク

2011/2/11(Fri) 23:30:46|NO.37019

「思い通り」の方が間違ってるのはよくある話で…まあ、その辺は間違えようの無い値使って確認してみてください。

> 物体の向いてる方向を向いてる軸ベクトルをオイラー角もしくは姿勢行列からつくればいい

getangiとかで取得できる値とは違うんでしょうか。
しかしfvfaceとかそんなので上手いこと簡単にできないのかな…うむ、hgimgは使い方すっかり忘れてしまった。


hgimg3は軽量で多くの環境で動作してくれるいいプラグインですが、難しいようならEasy3Dに乗り換えるのも手です。



WHITE

リンク

2011/2/12(Sat) 09:18:40|NO.37029

ぁ、言い方がわるかったですね;
一度いなえさんの方法をそのままやり実行結果を確かめた後、
改造してみてもうまくいかないということです。
fvfaceはすでにためしてみたのですが、表示がなぜかおかしくなったりしてできません。
objaimはなかなか使い方がよくわかんなくて・・・

Easy3dですか、うちの環境ではちと重くなってしまうのですが工夫しだいでなんとかする
というのもありですね。

とりあえずなかなか解決の兆しが見えないのでEasy3Dをいじってみます。


遅くなってしまいましたが、
回答ありがとうございました^^



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