HSP3.5HGIMG4 물리 주사위
HSP3.5HGIMG4에서는 getquat, setquat을 통해Quanion에서 대상 자세를 얻거나 설정할 수 있다.이것은 물리 연산의 결과를 다른 대상의 자세에 더욱 쉽게 적용할 수 있게 한다.
이번에는 이 getquat, setquat을 포함한 물리 주사위를 만들어 보자.
샘플 코드는 다음과 같습니다.
#include "hgimg4.as"
#module
#deffunc qmul array a1, array a2, array a3, local l, local lre1, local lre2
// a1 と a2 のクォータニオン積を a3 に格納する
lre1 = a1.3
lre2 = a2.3
l.0 = a1.0, a1.1, a1.2
fvinner l, a2.0, a2.1, a2.2
a3.3 = lre1 * lre2 - l.0
l.0 = a1.0
fvouter l, a2.0, a2.1, a2.2
a3.0 = l.0 + lre2 * a1.0 + lre1 * a2.0
a3.1 = l.1 + lre2 * a1.1 + lre1 * a2.1
a3.2 = l.2 + lre2 * a1.2 + lre1 * a2.2
return
#deffunc qrot array ap, array aq, array ar, local p, local f, local c
// 座標 ap を クォータニオン aq で回転して ar に格納する
p.0 = ap.0, ap.1, ap.2, 0.0
ddim f,4
qmul aq, p, f
c.0 = -aq.0, -aq.1, -aq.2, aq.3
qmul f, c, ar
return
#global
#const EG_CALC GPDRAW_OPT_OBJUPDATE
#const EG_DRAW2D (GPDRAW_OPT_DRAW2D | GPDRAW_OPT_DRAW2D_LATE)
#const EG_DRAW3D (GPDRAW_OPT_DRAWSCENE | GPDRAW_OPT_DRAWSCENE_LATE)
#const DELTA 0.0001
randomize
gpreset
setcls CLSMODE_NONE
// 回転用障害物
gpbox id, 2, 0x333333
setpos id, 7.5, 5, -3.5 + double(rnd(100)) * 0.01
gppbind id, 0
// アヒルと箱
gpload id, "res/duck"
setscale id, 0.8, 0.8, 0.8
duck_id = id
gpbox id, 2, 0xcccc00
setpos id, 6, 9, -2
gppbind id, 1.0, 0.5
gppset id, GPPSET_DAMPING, 0.0, 0.0
gppset id, GPPSET_FRICTION, 0.5, 0.75
setalpha id, 128
box_id = id
// 床
gpfloor id, 40,40, 0x6666cc
gppbind id, 0, 0.5
gppset id, GPPSET_FRICTION, 0.5, 0.75
setangr GPOBJ_LIGHT, -96, 32, 0
setpos GPOBJ_CAMERA, 2, 21, 12
gplookat GPOBJ_CAMERA, 0, 3, 0
sdim faces,256,7
faces.0 = "none"
faces.1 = "head"
faces.6 = "foot"
faces.2 = "tail"
faces.5 = "chest"
faces.3 = "left"
faces.4 = "right"
ddim scores,7
// クォータニオン用変数
ddim q,4
ddim result,4
fix = 0
getreq prets, SYSREQ_TIMER
pre.0 = -999.0, -999.0, -999.0
repeat
getreq ts, SYSREQ_TIMER
getreq fps, SYSREQ_FPS
redraw 0
color 0,0,0x33
boxf
gpdraw EG_CALC
// 箱の状態をアヒルに反映
getpos box_id, x,y,z
setpos duck_id, x,y,z
getquat box_id, q.0, q.1, q.2, q.3
setquat duck_id, q.0, q.1, q.2, q.3
// 3つの基底を回転し (0,1,0) と内積を取る
p.0 = 1.0, 0.0, 0.0
qrot p, q, result
scores.5 = result.1
scores.2 = -result.1
p.0 = 0.0, 1.0, 0.0
qrot p, q, result
scores.1 = result.1
scores.6 = -result.1
p.0 = 0.0, 0.0, 1.0
qrot p, q, result
scores.4 = result.1
scores.3 = -result.1
gpdraw EG_DRAW2D | EG_DRAW3D
pos 16,16
color 224,224,224
font "",36
mes strf("%2d [fps]", fps)
max_score = -2.0
max_fix = 0
repeat 6,1
mes strf("%d:",cnt) + faces.cnt + ": " + scores.cnt
if scores.cnt > max_score {
max_score = scores.cnt
max_fix = cnt
}
loop
// 動きチェック
if fix == 0 {
diff = powf(x - pre.0, 2.0) + powf(y - pre.1, 2.0) + powf(z - pre.2, 2.0)
if diff < DELTA {
// 1.0秒止まったら確定とする
if ts - prets >= 1000 {
fix = 1
}
} else {
prets = ts
}
// 前回の位置を覚えておく
pre.0 = x,y,z
} else {
color 224,0,0
}
// 現在の目
gpcnvaxis x2,y2,z2, x,y,z
pos x2 - 9, y2 - 72
mes max_fix
redraw 1
await 1000/60
loop
주사위를 붙이는 눈이 귀찮아서 주사위 눈 대신 오리 방향을 쓴다.눈.
오리 가루
1
정수리에서
2
꼬리
3
좌익
4
오른쪽 날개
5
정면
6
다리
실행 결과 1
변환 중 권장사항 표시
실행 결과2
눈금을 확정한 후 빨간색으로 표시하다
또한 샘플 코드 내의 qrot 함수는 위치 벡터가 할당량 이도로 회전하는 함수이기 때문에 대상 방향으로 뻗은 벡터의 계산 등 다른 목적에도 응용할 수 있다.
주의
이 샘플은 물리 주사위의 출처를 판정하였으나 초기 상태와 파라미터의 관계로 1~6은 예쁜 랜덤수로 나온 것이 아니니 이해하고 사용하시기 바랍니다.만약 이렇게 사용한다면 더욱 화려하게 회전하기 위해 파라미터 설정치를 조정하여 출발점을 적절하게 분리할 수 있다.
Reference
이 문제에 관하여(HSP3.5HGIMG4 물리 주사위), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hta393939/items/3e358e7e852b34b4552c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)