追記
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でおこなっています。