クォータニオンを取得できるので、実際に利用する方法を探っているところです。
ということで、コントローラーを傾けるとタマネを操作できるサンプルを作ってみました。
ジョイコンは縦持ちしてください。
JoyShockLibraryとJoyShockLibrary for HSP3が必要です。
#include "hgimg4.as"
#include "JoyShockLibrary.hsp"
; クォータニオンを計算
#module
#deffunc mulq_E var v_qpx, var v_qpy, var v_qpz, var v_qpw, \
double p_qx, double p_qy, double p_qz, double p_qw, \
double p_px, double p_py, double p_pz, double p_pw
v_qpx = p_qw * p_px - p_qz * p_py + p_qy * p_pz + p_qx * p_pw
v_qpy = p_qz * p_px + p_qw * p_py - p_qx * p_pz + p_qy * p_pw
v_qpz = -p_qy * p_px + p_qx * p_py + p_qw * p_pz + p_qz * p_pw
v_qpw = -p_qx * p_px - p_qy * p_py - p_qz * p_pz + p_qw * p_pw
return
#define global mulq(%1, %2, %3) mulq_E %1(0), %1(1), %1(2), %1(3), %2(0), %2(1), %2(2), %2(3), %3(0), %3(1), %3(2), %3(3)
#global
;------------------------------
; コントローラー
;------------------------------
; JslGetSimple
buttonJs = 0
ddim analogJs, 6
; JslGetMotion
ddim mtQuat, 4
ddim mtAccel, 3
ddim mtGyro, 3
; 接続されているコントローラーデバイスを接続して、接続数を取得
numConnectJoystick = JslConnectDevices()
;------------------------------
; 環境
;------------------------------
gpreset
setcls CLSMODE_SOLID, $404040
setcolor GPOBJ_LIGHT, 1,1,1
setdir GPOBJ_LIGHT, 0.5,0.5,0.5
;------------------------------
; オブジェクトノード
;------------------------------
; 床
gpfloor id_floor, 30,30, $4040F0
gpsetprm id_floor, PRMSET_ALPHA, 127
; 3Dモデル
gpload id_model,"res/tamane2"
setscale id_model, 0.1,0.1,0.1
; アニメーションクリップ
gpact id_model
; クォータニオン
;Y軸 -90度回転
qlym90 = 0.0, -1.0/sqrt(2), 0.0, 1.0/sqrt(2)
ddim p, 4
ddim q, 4
;------------------------------
; カメラ
;------------------------------
setpos GPOBJ_CAMERA, 0,35,-40
gplookat GPOBJ_CAMERA, 0,14,0
;------------------------------
; メインループ
;------------------------------
*main
key0 = key
stick key, 256|16
if key&128 : end
redraw 0 ; 描画開始
;------------------------------
; コントローラー入力
;------------------------------
if numConnectJoystick > 0 {
deviceId = 0
; 姿勢を取得
JslGetMotion deviceId, mtQuat, mtAccel, mtGyro
; Y軸の回転方向を反転
setquat id_model, mtQuat(0), mtQuat(1), -mtQuat(2), mtQuat(3)
; モデルの向きを調整
addang id_model, deg2rad(180), deg2rad(90), deg2rad(0)
; 全体をY軸まわりに90度回転
getquat id_model, p(0), p(1), p(2), p(3)
mulq q, qlym90, p
setquat id_model, q(0), q(1), q(2), q(3)
; 正面向きの再調整
; コントローラーを正面に向けて、スペースキーを押します。
; スペースキーを押している間、キャリブレーションが行われます。
if ((key0 & 16)=0) & ((key & 16)!0) : JslStartContinuousCalibration deviceId
if ((key0 & 16)!0) & ((key & 16)=0) : JslPauseContinuousCalibration deviceId
}
gpdraw ; シーンの描画
;------------------------------
pos 0,0
color 255,255,255
mes "sample"
redraw 1 ; 描画終了
await 1000/60 ; 待ち時間
goto *main