HSP3.5HGIMG4 물리 주사위

4611 단어 HSPHSP3
getquat과 setquat
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은 예쁜 랜덤수로 나온 것이 아니니 이해하고 사용하시기 바랍니다.만약 이렇게 사용한다면 더욱 화려하게 회전하기 위해 파라미터 설정치를 조정하여 출발점을 적절하게 분리할 수 있다.

좋은 웹페이지 즐겨찾기