HU3DM 説明


HSP Universal 3D Module


このモジュールでは右手系を使う。
角度はラジアンで表す。

撮影される物体の最小単位は「パーツ」。それらの集合が「モデル」。その存在する空間が「ワールド」。


index
  1. zソート

  2. ワールド

  3. カメラ

  4. 光線

  5. 光の効果

  6. モデル

  7. パーツ

  8. ポリゴン描画直前後コールバック

  9. モデルの幾何操作

  10. 高度な操作

  11. モデルファイル

  12. ルーチン

  13. 本モジュールを使うプログラムの一般的な構成


< 序 >

 HU3DM (HSP Universal 3D Module) は、HSPの標準命令だけを通してzソート、光の効果を考慮した簡易な3D描画を行うためのモジュールである。最大の特徴は標準命令のみで成り立っていることであり、従って標準のHSPランタイムはもちろんのこと、hsp3dish, hsp3dish.js等、HSPが満足に動くあらゆる環境で動作可能である。

 しかし標準命令だけで座標計算,光の効果の計算を行っている為、容易に想像できることだがHSP用3Dプラグインと比してとんでもなく処理が遅い。ツール系アプリの小規模な3Dエフェクトが関の山で、激しい描画が要求されるアクションゲームには不向きである。

 では一体何の役に立つのか?ということになるが、これは元々作者の数学的興味で作り始めたものであり、「ほとんど何の役にも立たない」と言わざるを得ないのが正直なところである。数学的な形状の立体を自分で組んだプログラムから生成し、それを動かして眺めてみたい、そんな動機で作り始めた。もし読者が同じ事を考えているなら、読者にとっていささかの価値はあるかもしれない。手に取った人それぞれの興味の赴くままに使ってもらえれば作者としてはそれで十分幸せである。


< zソート >

描画では「画家のアルゴリズム」を用いる。
パーツのzソートではパーツの重心とカメラの眼点の距離を用いる。

< 通常 >

まずモデル単位でzソートされ、次に各モデル毎にパーツ単位でzソートされる。
従って、モデルが絡み合うような複雑な状況は正しく描画できない。

パーツ単位でのソートのスイッチがモデル毎に用意されていて、必要に応じてoffにできる。
タイルが一面に並んだようなモデルではスイッチをoffにして無用な計算を減らすべきである。

モデルには0〜9の「z優先度」がある。数字が大きいほど優先度が大きい、つまり後で描画される。
モデル単位でのソートでは同じ優先度をもつもの同士で比較が行われる。

< 特殊 >

モデル単位でのソートではなくすべてのモデルのパーツ同士でzソートを行って描画することもできる。
専用の命令を使う。


< ワールド >

モデルの存在する空間。
「ワールド」は座標空間であり、この座標系を「ワールド座標系」と呼ぶ。
座標軸を xw, yw, zw とする。
単位ベクトルを vi_w, vj_w ,vk_w とする。
xw,yw平面が「地平面」でzwの正の無限遠方が「天」。

ワールド一つ当たりのモデルIDの上制限は「UPLIM_ID_MODEL_PER_WORLD」で定まり、所定の手続きで変更できる。デフォルトで99
ワールド構造体に属するモデル一つ当たりのパーツIDの上制限は「UPLIM_ID_PART_PER_MODEL_IN_WORLDSTRUCT」で定まり、所定の手続きで変更できる。デフォルトで99
どちらにも上位の制約があり、ともに 2^16 = 65536 以下でなくてはならない。
この制約は「HU3DM_zSortAllVisiblePartsInWorldStruct」命令の内部構造に由来する。
また、どちらも小さければ小さいほどメモリ使用量を抑えられる。

< ワールド構造体 >

ワールド1つ分の情報を保持するのが「ワールド構造体」である。
これには「int体」と「double体」がある。
前者はint型データ、後者はdouble型データを保持する配列である。両者はセットで使う。
無意味な要素は任意の値で構わない。

< int体 >

[UPLIM_ID_MODEL_PER_WORLD+2, UPLIM_ID_PART_PER_MODEL_IN_WORLDSTRUCT+2, 21]int型配列。

< 要素(0,0,c) >

cの各値とそれに対応する情報は次の通り。

0 : UPLIM_ID_MODEL_PER_WORLD
1 : 保有するモデル数
2 : 保有する可視モデル数

< 要素(a,b,c) (a=1,2,...,UPLIM_ID_MODEL_PER_WORLD+1) >

第a-1番モデルの情報。

< 要素(a,0,c) >

cの各値とそれに対応する情報は次の通り。

0 : 第a-1番モデルの有無。(0,1)=(無,有)
1 : z優先度 (0〜9)
2〜5 : モデル構造体の(0,1)〜(0,4)に対応

< 要素(a,b,c) (b=1,2,...,UPLIM_ID_PART_PER_MODEL_IN_WORLDSTRUCT+1) >

第b-1番パーツの情報。
cの各値とそれに対応する情報はモデル構造体と同様。

< double体 >

[UPLIM_ID_MODEL_PER_WORLD+2,UPLIM_ID_PART_PER_MODEL_IN_WORLDSTRUCT+2,33]double型配列。

< 要素(a,b,c) (a=1,2,...,UPLIM_ID_MODEL_PER_WORLD+1) >

第a-1番モデルの情報。

< 要素(a,0,c) >

モデル全体の情報。
cの各値とそれに対応する情報は次の通り。

0,1,2 : モデル原点のワールド座標
3,4,5 : vi_m_(a-1)のxw,yw,zw成分
6,7,8 : vj〃
9,10,11 : vk〃

< 要素(a,b,c) (b=1,2,...,UPLIM_ID_PART_PER_MODEL_IN_WORLDSTRUCT+1) >

第b-1番パーツの情報。
cの各値とそれに対応する情報は次の通り。

0〜14 : モデル構造体のdouble体の(b,0)〜(b,14)と対応。
(15,16,17) : 第1頂点のワールド座標
(18,19,20) : 第2〃
(21,22,23) : 第3〃
(24,25,26) : 第4〃
(27,28,29) : 重心のワールド座標
(30,31,32) : (第1→2頂点ベクトル)×(第1→4頂点ベクトル)と同じ向きを向く単位ベクトルのxw,yw,zw成分。つまり四角形の法線ベクトルの一つ。


< カメラ >

カメラには「眼点」と「網膜」がある。
カメラは眼点を原点とする座標系をもち、これを「カメラ座標系」という。
また、 座標軸を xeye, yeye, zeye とする。
単位ベクトルを vi_cam, vj_cam, vk_cam とする。

カメラの基本姿勢」とは、カメラの姿勢の基準である。この姿勢では、xeye,yeye,zeye 軸がそれぞれ xw,yw,zw軸と並行で、正の向きも一致している。

眼点のワールド座標を x_eye_cam, y_eye_cam, z_eye_cam とする。
vi_camの向きが「前」。
vk_camの向きが「上」。
vj_camの向きが「左」。
眼点から -vi_cam の位置に「網膜原点」があり、網膜原点を中心としてカメラ後方に展開する半径1の半球面が「網膜」である。

ワールド内の"点"が網膜につくる"点像"を如何にHSPのウィンドウに描画するかということが本モジュールの肝の一部である。

「yeye, zeye の成す平面」と平行で網膜原点を通る平面を「網膜標準接平面 (SRTP (Standard Retina Tangent Plane))」と呼ぶ。
この平面もまた座標系を持ち、これを「網膜標準接平面座標系 (SRTPCS)」と呼ぶ。この座標軸を次のように定める。
網膜原点を通り、yeye と並行で正の向きを同じくする座標軸を xsrtp とし、 zeye と並行で正の向きを異にする座標軸を ysrtp とする。
また、この座標系の単位ベクトルを vi_srtp, vj_srtp とする。

網膜上の点像Iの位置を表現する方法を次のように定める。

Iから網膜原点(※Oとする)まで網膜に沿って移動する最短経路をPとし、その長さをRとする。
SRTPへのIの正射影をI'とし、OからI'へのベクトルを →OI' とする。
→OI' によってIの位置は完全に記述できる。
後の描画で使うために、→OI' と xsrtp の正の向きとの成す角を求め、θとしておく。

視野角は120°である。従って、網膜のうち実質的に使用される部分は網膜原点を中心として網膜に沿って距離π/3以下で到達できる範囲に限られる。
この部分を特に「有効網膜」と呼ぶ。

HSPユーザーはウィンドウ上で網膜原点に対応する位置と、「描画領域」(円形)の半径を決める必要がある。
前者を「(ウィンドウ上での)描画中心」、後者を「(ウィンドウ上での)描画半径」と呼ぶ。
デフォルトで前者は(320px,240px)、後者は400px。
描画領域の縁が有効網膜の縁と対応する。ウィンドウ一杯に描画するなら半径はウィンドウの対角線の長さの半分とすればよいが、
周囲が見えすぎて不都合なら描画半径を大きくしてカメラを後退させるなど、適宜工夫されたい。

点像Iに対するRθが分かっていて、ウィンドウ上での描画中心を(dx,dy), 描画半径をdrとすると、
HSPウィンドウ上で点像Iに対応する点の座標は(dx + ((π*R*dr)/3)*cosθ, dy - ((π*R*dr)/3)*sinθ)で決められる。

< カメラ構造体 >

カメラの位置と姿勢情報を保持するのが「カメラ構造体」である。
これには「int体」と「double体」がある。
前者はint型データ、後者はdouble型データを保持する配列である。両者はセットで使う。
無意味な要素は任意の値で構わない。

< int体 >

3要素配列。

(0),(1) : ウィンドウ上での描画中心の座標
(2) : 〃描画半径

< double体 >

21要素配列。

(0),(1),(2) : 眼点のワールド座標
(3),(4),(5) : vi_camのxw,yw,zw成分
(6),(7),(8) : vj〃
(9),(10),(11) : vk〃
(12),(13),(14) : 網膜原点のワールド座標
(15),(16),(17) : vi_srtpののxw,yw,zw成分
(18),(19),(20) : vj_srtpののxw,yw,zw成分

 

カメラ構造体のint,double体はそれぞれ「CAMSTRUCT_int@HU3DM_0」,「CAMSTRUCT_double@HU3DM_0」という名前である。
普通、ユーザーが直接編集することはないが、特別な事情で手を出す場合は壊さないように十分な注意が必要。


< 光線 >

ワールドを無限遠方から無限遠方へと貫く平行光線。
あらゆるオブジェクトを通り抜け、減衰もしない。つまり影が表現できない。

普通はメタンの正四面体形のように無限遠方から炭素原子(原点)に向かって水素の方向から光を当てるイメージでワールドに光線を走らせ、 天からの光は強く、地面からの光は弱くしておけばよい。
正四面体の"3本の足"の配置は様々あるが、その一つについて計算すると地面からの3つの光線のベクトルはそれぞれ(-0.94,0,0.33), (0.47,-0.81,0.33), (0.47,0.81,0.33) となる。強さは適宜調節する。

光線は必ず10本存在し、0〜9のIDが割り当てられる。

強さは0以上であるが、普通は0〜1とする。
方向ベクトルは大きさを1とする。

< 光線構造体 >

光線の情報を保持するのが「光線構造体」である。
(10,4)double型配列。
要素(a,b) (a=0,1,...,9) は第a光線の情報。
bの各値とそれに対応する情報は次の通り。

0 : 強さ (0≧) 普通は0〜1。
1 : 方向ベクトルのxw成分
2 : 〃yw
3 : 〃zw

 

光線構造体は「RAYSTRUCT@HU3DM_0」という名前である。
普通、ユーザーが直接編集することはないが、特別な事情で手を出す場合は壊さないよう十分に注意すること。


< 光の効果 >

簡易的な光の効果を再現する。
光線のパーツ平面への入射角度とカメラの位置をもとにパーツの色を決めるだけである。
しかもその計算方法は私が勝手に考えた方法なので現実とは異なる
とはいえ、素人目にはそれなりにリアルに見える
効果を考慮するかどうかはモデル毎に決めることができる。
計算は「光の効果の計算.pdf」を参照。

光の効果を適用する場合で、かつテクスチャを使用する場合は透過色は不可能なので設定は無視される。


< モデル >

パーツの集合体。
UPLIM_ID_PART_PER_MODEL_IN_WORLDSTRUCTと、ワールド構造体に属さない個々のモデル1つ当たりのパーツIDの上制限は関係ない
但し、後者をiとすると、ワールド構造体へインポートする際にiがUPLIM_ID_PART_PER_MODEL_IN_WORLDSTRUCT以下である必要がある。

モデルは「モデル原点」と、それを原点とする座標系をもつ。これを「モデル座標系」と呼ぶ。
第aモデルの座標軸を xm-a, ym-a, zm-a とする。
また、単位ベクトルを vi_m-a, vj_m-a, vk_m-a とする。
また、原点のワールド座標を xmo-a, ymo-a, zmo-a とする。

「モデルの基本姿勢」とは、モデルの姿勢の基準である。この姿勢では、xm,ym,zm 軸がそれぞれ xw,yw,zw軸と並行で、正の向きも一致している。

< モデル構造体 >

モデル1つ分のデータを保持するのが「モデル構造体」である。
これには「int体」と「double体」がある。
前者はint型データ、後者はdouble型データを保持する配列である。両者はセットで使う。
無意味な要素は任意の値で構わない。
パーツIDの上制限がiであるようなモデルの場合、下のようになる。

< int体 >

[i+2,21]int型配列。

< 要素(0,b) >

bの各値とそれに対応する情報は次の通り。

0 : i
1 : パーツのzソートスイッチ。(0,1)=(無効,有効)
2 : 保有するパーツ数
3 : 光の効果の適用スイッチ。(0,1)=(適用しない,する)
4 : 可視/不可視スイッチ。 (0,1)=(不可視,可視)

< 要素(a,b) (a=1,2,...,i+1) >

第a-1番パーツの情報。
bの各値とそれに対応する情報は次の通り。

0 : 第a-1番パーツの有無。(0,1)=(無,有)
4〜20 : パーツ構造体のint体の(0)〜(16)に対応。

< double体 >

[i+2,15]double型配列。
要素(a,b) (a=1,2,...,i+1) は第a-1番パーツの情報。

bの各値とそれに対応する情報はパーツ構造体のdouble体と同様。

 

モデル構造体は単なる配列にすぎない。ファイルに保存しておけば別のプログラムからロードして再利用できる。


< パーツ >

四角形のみ使える。
4頂点すべてが視野内に入っている場合に限り描画できる。
平面である(ねじれていない)という仮定のもとで諸計算を行う。
大きくねじれている場合は正常に描画できないがエラーにはならない。
単色 or テクスチャ貼り が選べる。
ただし、使用するテクスチャは全てまとめて一つのウィンドウに用意しておかなくてはならない。
このウィンドウを「テクスチャ素材ウィンドウ」といい、デフォルトでは0番ウィンドウである。

< パーツ構造体 >

パーツ1つ分のデータを保持するのが「パーツ構造体」である。
これには「int体」と「double体」がある。
前者はint型データ、後者はdouble型データを保持する配列である。両者はセットで使う。
無意味な要素は任意の値で構わない。

< int体 >

17要素int型配列

(0) : 描画オプション1。(0,1)=(単色,テクスチャ)
(1) : 不透明度 (0〜255)
(2) : 光沢度 (0〜255)

< 単色の場合 >

(5,6,7) : 色のr,g,b値

< テクスチャ貼りの場合 >

(5,6,7,8) : 第1〜4頂点に対応する四角形テクスチャのx座標群
(9,10,11,12) : 〃y
(13) : 透過色有効フラグ。
(14,15,16) : 透過色のr,g,b値。

< double体 >

15要素double型配列

(0),(1),(2) : 第1頂点のモデル座標系座標
(3),(4),(5) : 第2〃
(6),(7),(8) : 第3〃
(9),(10),(11) : 第4〃
(12),(13),(14) : 重心のモデル座標系座標

※第1〜4頂点は環状に配置
三角形にする場合は必ず第3,4頂点を一致させる。その他は一致させてはならない。
※第1,2,4頂点は同一直線上にあってはならない。0除算エラーが起こって復帰できなくなる。


< ポリゴン描画直前後コールバック >

各ポリゴンについてその描画の直前直後に、ユーザーが事前に指定しておいたラベルにサブルーチンジャンプするようになっている。

描画直前のサブルーチンジャンプを「ポリゴン描画直前コールバック(PDCB1)」と呼び、直後のサブルーチンジャンプを「ポリゴン描画直後コールバック(PDCB2)」と呼ぶ。ジャンプ先ではモジュールが提供する様々な情報を取得することができる。

PDCB1を受けたときに「flg_ContinueDrawing@HU3DM_1091」変数に0を代入するとそのポリゴンの描画が1回だけキャンセルされる。

この機能を上手く利用することで高度な情報を取得したり、ユーザーの手で描画を細かくコントロールすることができる。(例えば特定のポリゴンのみに特殊な色を重ねたり、付近に文字を表示したり、または描画をキャンセルしてユーザー側で線分を描画することでワイヤーフレーム描画を実現したり。)

ジャンプ先では描画されようとしているポリゴンの情報を次の定数および変数から得ることができる。変数については書き換えも可能であるが、不正な値によりエラーが起こらないように注意が必要である。

2014/11/1 現在、android版hsp3dishではポリゴン描画直前後コールバック機能が使えない。
使おうとしてエラーになるわけではないが、コールバック先で何も描画できない。(line等の命令を実行しても画面に反映されない。)
hsp3dish側の問題であると思われる。(ユーザー定義命令からのgosub先で描画が失敗しているのではないか?)いずれ修正されるかもしれない。
尚、コールバック先で描画キャンセル要求の発動は可能である。


< モデルの幾何操作 >

 モデルを撮影するためにはそれに属するパーツのワールド座標を計算しなくてはならない。モデル座標系からワールド座標系への変換である。
モデル原点のワールド座標とモデル座標系の単位ベクトル(=姿勢情報)が決まれば、パーツのワールド座標は決まる。
撮影前の段階で全てのパーツのワールド座標や法線ベクトルが計算されている必要がある。
ここで重要なのは、"撮影前の段階で"計算が完了していれば十分であるということ。
複数の幾何操作を組み合わせて段階を踏む場合(例えば 平行移動 → 回転 → 変倍)、各段階毎にモデル原点とモデル座標系単位ベクトルの情報を書き換える必要があるが、パーツのワールド座標や法線ベクトルを計算するのは最終段階の幾何操作を完了させる時だけで十分である。各段階毎に計算する必要いし、そうしていたのでは無駄な計算に時間を食われてしまう。

 そういうわけで、本モジュールではモデルの幾何操作の命令の多くに「モデルのパーツの幾何パラメータ演算スイッチ」が付いている。これがONの時のみ計算を行うようになっている。幾何操作の最終段階の命令でこのスイッチをONにし、それより前の段階ではOFFにする。そうすれば無駄な計算をせずに済む。尚、幾何操作の最終段階の命令でスイッチをOFFにしていると、パーツのワールド座標が更新されず古いままなので、「過去の状態」が描画されることになる。


< 高度な操作 >

提供するルーチンでは((できない)または(無用なエラーチェックで低速になる))ような操作はワールド構造体を直接編集することで可能になるかまたは高速化される。
ワールド構造体のint,double体はそれぞれ「WORLDSTRUCT_int@HU3DM_0」,「WORLDSTRUCT_double@HU3DM_0」という名前である。
手を出す際は構造体を壊さないよう十分に注意すること。


< モデルファイル >

 しばしば、一度作成したモデルをファイルに保存して別の機会にロードして使用したいと思うことがある。
この要求に対応するため、本モジュールは「モデルファイル」の入出力をサポートする。
モデル構造体のint,double体と、テクスチャその他の情報をまとめたファイルがモデルファイルである。推奨拡張子は「hmf」(HU3DM Model File)。
これのロード・セーブは専用命令で行うのでユーザーは普通、ファイルの構造を知っておく必要はない。

< モデルファイルの構造 >

以下ではファイルデータの先頭をインデックス0として、aバイト目〜bバイト目の区間を [a,b] と表記する。
hmfファイルの構造は下の通り。

[0,3] : パーツIDの上制限(4byte 非負整数)。この値を PidUpLim とする。
[4,5] : テクスチャ画像ファイル情報(※後述のテキストデータ)のデータサイズ(2byte 非負整数)。この値を Size_TexInfo とする。
[6,6 + 4*(PidUpLim+2)*21] : int体
[i0,i0 + 8*(PidUpLim+2)*12] : double体。(※i0 = 6 + 4*(PidUpLim+2)*21)
[i1,i1 + Size_TexInfo] : テクスチャ画像ファイル情報(※後述のテキストデータ)。(SJIS text)。(※i1 = i0 + 8*(PidUpLim+2)*12)

< テクスチャ画像ファイル情報 (TexInfo) >

 これは、モデルが参照するテクスチャを格納した画像ファイルのパスと、画像の希望読み込み先ウィンドウIDおよび座標を保存した単なるテキストデータである。
希望する画像ファイルの個数だけの行数を持ち、改行コードは(行数-1)個。(つまり最後の行末に改行コードはなく、1つのヌル文字で終わる。)
各行は次のように表現されている。

TexRelativePath|w,h|wid|px,py

TexRelativePath : hmfファイルのあるディレクトリを基準とした、画像ファイルの相対パス。
w,h : その画像ファイルの幅と高さ
wid : 希望読み込み先ウィンドウID
px,py : 希望読み込み先座標

(例)

Metal.png|256,128|1|0,0


< ルーチン >

第1,2水準ルーチンがある。
第1水準は一般ユーザー向け。
第2水準は内部ルーチン。スキルユーザー向け。

< 第一水準 >

index

 

ルーチン名 説明
HU3DM_init モジュールの初期化

[書式]

HU3DM_init

 

HU3DM_setDrawCenterOnWindow ウィンドウ上での描画中心の設定

[書式]

HU3DM_setDrawCenterOnWindow x,y

x,y : 座標

 

HU3DM_setDrawCircleRadius ウィンドウ上での描画半径の設定

[書式]

HU3DM_setDrawCircleRadius r

r : 半径

 

HU3DM_setPDCBL ポリゴン描画直前後コールバックラベルの設定

[書式]

HU3DM_setPDCBL L1,L2

L1 : 直前コールバックラベル
L2 : 直後〃

[備考]

L1,L2 にそれぞれ *NullLabel@HU3DM_0,*NullLabel@HU3DM_0 を指定することでコールバックを無視できる。
(本モジュールが用意してる空ラベルがコールバック先になる。)

 

HU3DM_setRays 光線の設定

[書式]

HU3DM_setRays k,i ,x,y,z

k : 光線番号
i : 強さ
x,y,z : 方向ベクトル (非ゼロである限り大きさは気にしなくてよい)

[実行後のstatの値]

(0,1)=(成功,引数不正)

 

HU3DM_setCamPos カメラ眼点のワールド座標の設定

[書式]

HU3DM_setCamPos x,y,z, opt

x,y,z : ワールド座標または変位
opt : 位置指定オプション。(0,other) = (絶対指定,現在の座標に加算)

 

HU3DM_setCamPosture_1 カメラの姿勢の決定。
ロール,ピッチ,ヨーで表現。この順に回す。

[書式]

HU3DM_setCamPosture_1 r,p,y, opt

r,p,y : ロール,ピッチ,ヨー
opt : 基準姿勢指定オプション (0,other) = (現在の姿勢,カメラの基本姿勢)

 

HU3DM_setCamPosture_2 カメラの姿勢の決定。
「上」を表すベクトル(upベクトル)と注視点によって姿勢を決定。

[書式]

HU3DM_setCamPosture_2 a,b,c ,x,y,z

a,b,c : upベクトルのxw,yw,zw成分
x,y,z : 注視点のワールド座標

[実行後のstatの値]

(0,1) = (成功,数学的エラー)

[備考]

眼点→注視点ベクトルがupベクトルと平行な場合は処理できない。

 

HU3DM_setCamPosture_3 カメラの姿勢の決定。
まず、オプション指定があればカメラの姿勢を基本姿勢にセットする。指定がなければそのままとする。
その後、基準系を常に「回転前のカメラ座標系」としてカメラを回転させる。

[書式]

HU3DM_setCamPosture_3 θ,φ,ψ, opt

θ,φ,ψ : 回転角(※解説参照)
opt : 基準姿勢指定オプション (0,other) = (現在の姿勢,カメラの基本姿勢)

[解説]

回転前のカメラ座標系の座標軸をXeye,Yeye,Zeyeで表し、カメラ座標系そのものの座標軸をxeye,yeye,zeyeで表すとする。
まずxeye,yeye,zeyeをXeye軸回りにθ、次にYeye軸まわりにφ、最後にZeye軸まわりにψ回転させる。

 

HU3DM_setCamPosture_4 カメラの姿勢の決定。
vi_cam, vj_cam, vk_camを直接指定する。
甚だしく間違った値を設定すると以後の各種計算で異常が発生する。

[書式]

HU3DM_setCamPosture_4 xi,yi,zi, xj,yj,zj, xk,yk,zk

 

HU3DM_rotateCam カメラ座標軸周りの回転

[書式]

HU3DM_rotateCam opt,θ

opt : 軸指定オプション (1,2,other) = (xeye, yeye, zeye)
θ : 角度

 

HU3DM_setTexSrcWnd テクスチャ素材ウィンドウIDの指定

[書式]

HU3DM_setTexSrcWnd wid

wid : ウィンドウID

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_getPartsNumInModelInWorld ワールド中の指定されたモデルのパーツ数を取得する

[書式]

val = HU3DM_getPartsNumInModelInWorld(mid)

mid : モデルID

[戻り値]

(-1,other) : (引数不正, パーツの数)

 

HU3DM_getMaxPartIDInIndepModel ワールドから独立したモデルのパーツIDの最大値を取得する。
すなわち、最後尾のパーツのIDを取得する。

[書式]

val = HU3DM_getMaxPartIDInIndepModel(MODEL_I)

MODEL_I : モデル構造体のint体

[戻り値]

(-1,other) = (引数不正, 最大値)

 

HU3DM_getMaxPartIDInModelInWorld ワールド中の指定されたモデルのパーツIDの最大値を取得する。
すなわち、最後尾のパーツのIDを取得する。

[書式]

val = HU3DM_getMaxPartIDInModelInWorld(mid)

mid : モデルID

[戻り値]

(-1,other) = (引数不正, 最大値)

 

HU3DM_slideTexRefPosInIndepModel ワールドから独立している指定されたモデルの全てのパーツのテクスチャ参照先座標に定数を加える

[書式]

HU3DM_slideTexRefPosInIndepModel MSTRUCT_INT, dx,dy

MSTRUCT_INT : モデル構造体のint体
dx,dy : x,y方向変化量

[備考]

構造体のチェックはしていない。不正なデータは致命傷になる。

 

HU3DM_setModelIDUpperLimitPerWorld ワールド1つあたりのモデルIDの上制限を設定する

[書式]

HU3DM_setModelIDUpperLimitPerWorld n

n : 上制限

[実行後のstatの値]

(0,1,2) = (成功,引数不正,中止)

[備考]

n以上のIDのモデルが既に存在している場合は処理は中止される。

 

HU3DM_setPartIDUpperLimitInIndepModel ワールドから独立したあるモデルのパーツIDの上制限を設定する

[書式]

HU3DM_setPartIDUpperLimitInIndepModel MSTRUCT_INT, MSTRUCT_DBL, n

MSTRUCT_INT, MSTRUCT_DBL : モデル構造体のint体,double体
n : 上制限

[実行後のstatの値]

(0,1,2) = (成功,引数不正,中止)

[備考]

n以上のIDのパーツが既に存在している場合は処理は中止される。
構造体のチェックはしていない。不正なデータを渡すと致命傷になる。

 

HU3DM_setPartIDUpperLimitPerModelInWorldStruct ワールド構造体に属するモデル1つあたりのパーツIDの上制限を設定する。

[書式]

HU3DM_setPartIDUpperLimitPerModelInWorldStruct n

n : 上制限

[実行後のstatの値]

(0,1,2) = (成功,引数不正,中止)

[備考]

n以上のIDのパーツが既に存在している場合は処理は中止される。

 

HU3DM_scootOverPartIDInIndepModel ワールドから独立しているモデルにおいて、空きパーツIDが後方に集中するようにデータを並べ直す。

[書式]

HU3DM_scootOverPartIDInIndepModel MSTRUCT_I,MSTRUCT_D

MSTRUCT_I,MSTRUCT_D : モデル構造体のint体,double体

[戻り値]

モデルのパーツ数

[備考]

構造体のチェックはしていない。不正な構造体を渡すと致命傷になる。

 

HU3DM_scootOverPartIDInModelInWorld ワールドに属する指定されたモデルにおいて、空きパーツIDが後方に集中するようにデータを並べ直す。

[書式]

HU3DM_scootOverPartIDInModelInWorld mid

mid : モデルID

[戻り値]

(-1,other) = (引数不正,モデルのパーツ数)

 

HU3DM_importModelToWorldStruct ワールド構造体にモデルをインポートする。
モデルは基本姿勢で配置される。

[書式]

HU3DM_importModelToWorldStruct mid, MODEL_I,MODEL_D, zp

mid : 登録先ID
MODEL_I : int体
MODEL_D : double体
zp : z優先度

[実行後のstatの値]

(0,1,2) = (成功,引数不正,中止)

[備考]

モデル構造体のパーツIDの上制限がワールド構造体のそれを上回る場合、処理は中止される。
構造体のチェックはしていない。不正な構造体を渡すとHSPエラーになり復帰できない。

 

HU3DM_exportModelFromWorldStruct ワールド構造体からモデルをエクスポートしてモデル構造体を作成する

[書式]

HU3DM_exportModelFromWorldStruct mid, MODEL_I, MODEL_D

mid : モデルID
MODEL_I : エクスポート先int体
MODEL_D : エクスポート先double体

[実行後のstatの値]

(0,1) = (成功,引数不正)

[備考]

MODEL_I, MODEL_D配列は目的のモデルを格納するのに必要な最小限の大きさで確保される。

 

HU3DM_deleteModelInWorldStruct ワールド構造体からモデルを削除する

[書式]

HU3DM_deleteModelInWorldStruct mid

mid : モデルID

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_importPartToModelInWorldStruct ワールド構造体に属するモデルにパーツをインポートする

[書式]

HU3DM_importPartToModelInWorldStruct mid,pid, PART_I,PART_D

mid : モデルID
pid : 登録先パーツID
PART_I : int体
PART_D : double体

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_exportPartFromModelInWorldStruct ワールド構造体からパーツをエクスポートする

[書式]

HU3DM_exportPartFromModelInWorldStruct mid,pid, PART_I,PART_D

mid : モデルID
pid : パーツID
PART_I : int体
PART_D : double体

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_deletePartInModelInWorldStruct ワールド構造体からパーツを削除する

[書式]

HU3DM_deletePartInModelInWorldStruct mid,pid

mid : モデルID
pid : パーツID

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setModelPartsZSortSwInWorldStruct ワールド構造体に属するモデルのパーツのzソートスイッチを設定する

[書式]

HU3DM_setModelPartsZSortSwInWorldStruct mid, sw

mid : モデルID
sw : スイッチ (0,other)=(off,on)

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setModelLightEffectSwInWorldStruct ワールド構造体に属するモデルの光の効果の適用スイッチを設定する

[書式]

HU3DM_setModelLightEffectSwInWorldStruct mid,sw

mid : モデルID
sw : スイッチ (0,other)=(off,on)

 

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_visualizeModelInWorldStruct ワールド構造体に属するモデルの可視/不可視を設定する

[書式]

HU3DM_visualizeModelInWorldStruct mid, sw

mid : モデルID
sw : スイッチ (0,other)=(不可視,可視)

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setModelZPriorityInWorldStruct ワールド構造体に属するモデルのz優先度を設定する

[書式]

HU3DM_setModelZPriorityInWorldStruct mid, zp

mid : モデルID
zp : z優先度

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_slideTexRefPosInModelInWorld ワールド構造体に属する指定されたモデルの全てのパーツのテクスチャ参照先座標に定数を加える

[書式]

HU3DM_slideTexRefPosInModelInWorld mid, dx,dy

mid : モデルID
dx,dy : x,y方向変化量

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setPartDrawOpt1InWorldStruct ワールド構造体に属するモデルのパーツの描画オプションを設定する

[書式]

HU3DM_setPartDrawOpt1InWorldStruct mid,pid, opt

mid : モデルID
pid : パーツID
opt : 描画オプション1。(0,other)=(単色,テクスチャ)

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setPartOpacitasInWorldStruct ワールド構造体に属するモデルのパーツの不透明度を設定する

[書式]

HU3DM_setPartOpacitasInWorldStruct mid,pid, op

mid : モデルID
pid : パーツID
op : 不透明度 (0〜255)

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setPartDOBInWorldStruct ワールド構造体に属するモデルのパーツの光沢度を設定する

[書式]

HU3DM_setPartDOBInWorldStruct mid,pid, dob

mid : モデルID
pid : パーツID
dob : 光沢度 (0〜255)

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setPartColorInWorldStruct ワールド構造体に属するモデルのパーツの色を設定する

[書式]

HU3DM_setPartColorInWorldStruct mid,pid, r,g,b

mid : モデルID
pid : パーツID
r,g,b : 色のr,g,b値

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setPartTexSrcPosInWorldStruct ワールド構造体に属するモデルのパーツのテクスチャのウィンドウ座標を設定する

[書式]

HU3DM_setPartTexSrcPosInWorldStruct mid,pid, xarry, yarry

mid : モデルID
pid : パーツID
xarry : 第1〜4頂点に対応する四角形テクスチャのx座標群(double型)
yarry : 〃y

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_enablePartTexTrnsprntClrInWorldStruct ワールド構造体に属するモデルのパーツの透過色の有効/無効を設定する

[書式]

HU3DM_enablePartTexTrnsprntClrInWorldStruct mid,pid, sw

mid : モデルID
pid : パーツID
sw : スイッチ (0,other)=(off,on)

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setPartTexTrnsprntClrInWorldStruct ワールド構造体に属するモデルのパーツの透過色を設定する

[書式]

HU3DM_setPartTexTrnsprntClrInWorldStruct mid,pid, r,g,b

mid : モデルID
pid : パーツID
r,g,b : 色のr,g,b値

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setPartVertexModelPosInWorldStruct ワールド構造体に属するモデルのパーツの頂点のモデル座標を設定する

[書式]

HU3DM_setPartVertexModelPosInWorldStruct mid,pid, xarry, yarry, zarry, opt

mid : モデルID
pid : パーツID
xarry : 第1〜4頂点のx座標群(double型)
yarry : 〃y
zarry : 〃z
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

[備考]

頂点は環状に配置すること。
三角形にする場合は必ず第3,4頂点を一致させる。その他は一致させてはならない。
第1,2,4頂点は同一直線上にあってはならない。0除算エラーが起こって復帰できなくなる。

 

HU3DM_enumPartsInIndepModel_sphere ワールドから独立しているモデルにおいて、指定された点から一定距離(未満/以内/以上/超過)離れた位置に重心を持つパーツを列挙する。

[書式]

HU3DM_enumPartsInIndepModel_sphere MSTRUCT_INT,MSTRUCT_DBL, pidlist, x,y,z, r,opt

MSTRUCT_INT,MSTRUCT_DBL : モデル構造体のint,double体
pidlist : 結果を格納するint型1次元配列。
        モデルのパーツIDの上制限+1)要素分自動で確保される。
        列挙されたパーツのIDが先頭から詰めて記録される。
x,y,z : 基準点のモデル座標系座標
r : 距離
opt : 判定オプション。(0,1,2,3) = (未満,以内,以上,超過)。

[実行後のstatの値]

(-1,other) : (引数不正, 列挙されたパーツの数)

[備考]

構造体のチェックはしていない。不正な構造体を渡すと致命傷になる。

 

HU3DM_enumPartsInModelInWorld_sphere ワールドに属する指定されたモデルにおいて、指定された点から一定距離(未満/以内/以上/超過)離れた位置に重心を持つパーツを列挙する。

[書式]

HU3DM_enumPartsInModelInWorld_sphere mid, pidlist, x,y,z, r,opt

mid : モデルID
pidlist : 結果を格納するint型1次元配列。
        モデルのパーツIDの上制限+1)要素分自動で確保される。
        列挙されたパーツのIDが先頭から詰めて記録される。
x,y,z : 基準点のモデル座標系座標
r : 距離
opt : 判定オプション。(0,1,2,3) = (未満,以内,以上,超過)。

[実行後のstatの値]

(-1,other) : (引数不正, 列挙されたパーツの数)

 

HU3DM_enumPartsInIndepModel_plane ワールドから独立しているモデルにおいて、指定された点と法線ベクトルで定まる平面の(正領域,平面上及び正領域)に重心を持つパーツを列挙する。

[書式]

HU3DM_enumPartsInIndepModel_plane MSTRUCT_INT,MSTRUCT_DBL, pidlist, x,y,z, vi,vj,vk, opt

MSTRUCT_INT,MSTRUCT_DBL : モデル構造体のint,double体
pidlist : 結果を格納するint型1次元配列。
        モデルのパーツIDの上制限+1)要素分自動で確保される。
        列挙されたパーツのIDが先頭から詰めて記録される。
x,y,z : 平面が通る点のモデル座標系座標
vi,vj,vk : 法線ベクトルのモデル座標系成分
opt : 判定オプション。(0,1) = (平面を含まない,含む)

[実行後のstatの値]

(-1,other) : (引数不正, 列挙されたパーツの数)

 

[備考]

構造体のチェックはしていない。不正な構造体を渡すと致命傷になる。

 

HU3DM_enumPartsInModelInWorld_plane ワールドから独立しているモデルにおいて、指定された点と法線ベクトルで定まる平面の(正領域,平面上及び正領域)に重心を持つパーツを列挙する。

[書式]

HU3DM_enumPartsInModelInWorld_plane mid, pidlist, x,y,z, vi,vj,vk, opt

mid : モデルID
pidlist : 結果を格納するint型1次元配列。
        モデルのパーツIDの上制限+1)要素分自動で確保される。
        列挙されたパーツのIDが先頭から詰めて記録される。
x,y,z : 平面が通る点のモデル座標系座標
vi,vj,vk : 法線ベクトルのモデル座標系成分
opt : 判定オプション。(0,1) = (平面を含まない,含む)

[実行後のstatの値]

(-1,other) : (引数不正, 列挙されたパーツの数)

 

HU3DM_getMinCoveringBallRadiusOfIndepModel ワールドから独立しているモデルにおいて、指定された点を中心としてモデル全体を覆う最小の球の半径を求める。

[書式]

val = HU3DM_getMinCoveringBallRadiusOfIndepModel(MSTRUCT_INT,MSTRUCT_DBL, x,y,z)

MSTRUCT_INT, MSTRUCT_DBL : モデル構造体のint体,double体
x,y,z : 球の中心のモデル座標系座標

[戻り値]

(-1.0,other) = (引数不正,半径)

[備考]

構造体のチェックはしていない。不正な構造体を渡すと致命傷になる。

 

HU3DM_getMinCoveringBallRadiusOfModelInWorld ワールドに属する指定されたモデルにおいて、指定された点を中心としてモデル全体を覆う最小の球の半径を求める。

[書式]

val = HU3DM_getMinCoveringBallRadiusOfModelInWorld(mid, x,y,z)

mid : モデルID
x,y,z : 球の中心のモデル座標系座標

[戻り値]

(-1.0,other) = (引数不正,半径)

 

HU3DM_setModelPos モデル原点のワールド座標の設定

[書式]

HU3DM_setModelPos mid, x,y,z, opt1,opt2

mid : モデルID
x,y,z : 座標または変位
opt1 : 位置指定オプション。 (0,other) = (絶対指定,現在の座標に加算)
opt2 : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setModelPosture_1 モデルの姿勢の決定。
ロール・ピッチ・ヨーで表現。この順に回す。

[書式]

HU3DM_setModelPosture_1 mid, r,p,y, opt1,opt2

mid : モデルID
r,p,y : ロール,ピッチ,ヨー
opt : 基準姿勢指定オプション (0,other) = (現在の姿勢,モデルの基本姿勢)
opt2 : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setModelPosture_2 モデルの姿勢の決定。
「上」を表すベクトル(upベクトル)と注視点によって姿勢を決定。

[書式]

HU3DM_setModelPosture_2 mid, a,b,c, x,y,z, opt

mid : モデルID
a,b,c : upベクトルのxw,yw,zw成分
x,y,z : 注視点のワールド座標
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1,2) = (成功,引数不正,数学的エラー)

[備考]

眼点→注視点ベクトルがupベクトルと平行な場合は処理できない。

 

HU3DM_setModelPosture_3 モデルの姿勢の決定。
基準系を常に「回転前のモデル座標系」としてモデルを回転させる。
仕組みはHU3DM_setCamPosture_3と同様。

[書式]

HU3DM_setModelPosture_3 mid, θ,φ,ψ, opt1,opt2

mid : モデルID
θ,φ,ψ : 回転角
opt : 基準姿勢指定オプション (0,other) = (現在の姿勢,基本姿勢)
opt2 : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_setModelPosture_4 モデルの姿勢の決定。
vi_m, vj_m, vk_mを直接指定する。
甚だしく間違った値を設定すると以後の各種計算で異常が発生する。

[書式]

HU3DM_setModelPosture_3 mid, xi,yi,zi, xj,yj,zj, xk,yk,zk, opt

opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1,2) = (成功,引数不正,数学的エラー)

 

HU3DM_rotateModel モデル座標軸まわりの回転

[書式]

HU3DM_rotateModel mid, opt, θ, opt2

mid : モデルID
opt1 : 軸指定オプション (1,2,other) = (xm, ym, zm)
θ : 角度
opt2 : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_conbineModels ワールド構造体に属する複数モデルのコピーを合体して新たにモデルを作成する。
基本姿勢の新たな空モデルMnewを作成し、合体させるモデルのパーツのMnewに対する相対的位置関係を求め、Mnew座標系にコピーする。

[書式]

HU3DM_conbineModels n,midList, midDst

n : 合体させるモデルの個数
midList : モデルIDリスト。合体させるモデルのIDを先頭から順に書き込んだ配列
midDst : 生成するモデルの登録先モデルID

[実行後のstatの値]

(0,1,2) = (成功,引数不正,中止)

 

HU3DM_rotateModelFleshOnly ワールド構造体に属する指定されたモデルの身のみを回転させる。
モデル座標系はそのままに、構成するパーツ群のみをモデル座標系から一旦切り離して回転させ、その後再びセットする。

[書式]

HU3DM_rotateModelFleshOnly mid, θ,φ,ψ, opt

mid : モデルID
θ,φ,ψ : 回転角度(解説参照)
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

ターゲットのモデル座標軸のオリジナルをxm,ym,zmとする。それらのコピーxm2,ym2,zm2を作成する。
モデルの身をオリジナル座標軸から切り離し、コピー座標軸へ渡す。
コピー座標軸をxm2まわりにθ回転後、ym2まわりにφ回転、最後にzm2回りにψ回転させる。モデルの身も一緒に回転する。
その後、モデルの身をコピー座標軸から切り離し、オリジナル座標軸に渡す。

 

HU3DM_photoOneModelInWorldStruct ワールド構造体に属するモデルを1つ撮影する。

[書式]

HU3DM_photoOneModelInWorldStruct midplus, n

midplus : モデルID+1
n : 描画されたパーツ数を受け取る変数

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_photo ワールド構造体に属する全ての可視モデルを撮影する。

[書式]

HU3DM_photo n

n : 描画されたパーツ数を受け取る変数

 

HU3DM_superPhoto ワールド構造体に属するすべての可視パーツを全てまとめて強制的にzソートして撮影する。

[書式]

HU3DM_superPhoto n

n : 描画されたパーツ数を受け取る変数

 

HU3DM_makeRegularPolygonFrame 正多角形フレームデータの作成

[書式]

HU3DM_makeRegularPolygonFrame r, ndiv, θ,φ,ψ, ARRAY

r : 外接円半径
ndiv : 頂点数(≧3)
θ,φ,ψ : HU3DM_makeCuboidFrameと同様
ARRAY : 結果を受け取る配列

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

この処理で作成される一時モデルをMとする。
ARRAYの要素(i,3*k),(i,3*k+1),(i,3*k+2)には第iパーツの第k番頂点のM座標系座標が格納される。
(0≦i≦ndiv-1, 0≦k≦3)
各頂点の位置は無回転の場合を基準として考え、回転する場合は付随して動かす。
フレームデータの図解」の図1.1を参照。

 

HU3DM_makeCuboidFrame 直方体フレームデータの作成

[書式]

HU3DM_makeCuboidFrame lx,ly,lz, θ,φ,ψ, ARRAY

lx,ly,lz : x,y,z方向の長さ
θ,φ,ψ : [解説]を参照
ARRAY : 結果を受け取る配列

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

内部動作をわかりやすく表現すると次のようになる。
まず、直方体一時モデルMがワールド座標軸に沿って作成される。
この時点ではM独自のx,y,z座標系はワールドのそれと一致している。
その後、M独自の座標系と共にxM,yM,zM軸の順にθ,φ,ψ回転される。
その後、Mの各頂点のワールド座標は維持したまま
Mの座標軸のみをワールド座標軸と一致するように戻す。

こうすることで任意の傾きを持った直方体を作成できる。
θ=φ=ψ=0 とすれば無回転で生成できる。

ARRAYの要素(i,3*k),(i,3*k+1),(i,3*k+2)には第iパーツの第k番頂点のM座標系座標が格納される。
(0≦i≦5, 0≦k≦3)
各頂点の位置は無回転の場合を基準として考え、回転する場合は付随して動かす。
フレームデータの図解」の図1.2を参照。

 

HU3DM_makeSphereFrame 球体フレームデータの作成

[書式]

HU3DM_makeSphereFrame r, mdiv,ldiv, θ,φ,ψ, ARRAY

r : 半径
mdiv : 経度分割数
ldiv : 緯度分割数
θ,φ,ψ : HU3DM_makeCuboidFrameと同様
ARRAY : 結果を受け取る配列

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

ARRAYの要素(i,j,3*k),(i,j,3*k+1),(i,j,3*k+2)には第(i,j)パーツの第k番頂点のM座標系座標が格納される。
(0≦i≦mdiv-1, 0≦j≦ldiv-1, 0≦k≦3)
各頂点の位置は無回転の場合を基準として考え、回転する場合は付随して動かす。
フレームデータの図解」の図1.3を参照。

 

HU3DM_makeRegularPyramidFrame 正多角錐フレームデータの作成

[書式]

HU3DM_makeRegularPyramidFrame r,ndiv, h, θ,φ,ψ, ARRAY

r : 底面の外接円半径
ndiv : 底面の頂点数
h : 高さ
θ,φ,ψ : HU3DM_makeCuboidFrameと同様
ARRAY : 結果を受け取る配列

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

ARRAYの要素(i,3*k),(i,3*k+1),(i,3*k+2)には第iパーツの第k番頂点のM座標系座標が格納される。
(0≦i≦2*ndiv-1, 0≦k≦3)
各頂点の位置は無回転の場合を基準として考え、回転する場合は付随して動かす。
フレームデータの図解」の図1.4を参照。

 

HU3DM_makeRegularPrismFrame 正多角柱フレームデータの作成

[書式]

HU3DM_makeRegularPrismFrame r,ndiv, h, θ,φ,ψ, ARRAY

r : 底面の外接円半径
ndiv : 底面の頂点数
h : 高さ
θ,φ,ψ : HU3DM_makeCuboidFrameと同様
ARRAY : 結果を受け取る配列

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

ARRAYの要素(i,3*k),(i,3*k+1),(i,3*k+2)には第iパーツの第k番頂点のM座標系座標が格納される。
(0≦i≦3*ndiv-1, 0≦k≦3)
各頂点の位置は無回転の場合を基準として考え、回転する場合は付随して動かす。
フレームデータの図解」の図1.5を参照。

 

HU3DM_makeTorusFrame 円環体フレームデータの作成

[書式]

HU3DM_makeTorusFrame r,d, rdiv,ddiv, θ,φ,ψ, ARRAY

r : 大円半径
d : 小円半径
rdiv : 大円分割数
ddiv : 小円分割数
θ,φ,ψ : HU3DM_makeCuboidFrameと同様
ARRAY : 結果を受け取る配列

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

ARRAYの要素(i,j,3*k),(i,j,3*k+1),(i,j,3*k+2)には第(i,j)パーツの第k番頂点のM座標系座標が格納される。
(0≦i≦rdiv-1, 0≦j≦ddiv-1, 0≦k≦3)
各頂点の位置は無回転の場合を基準として考え、回転する場合は付随して動かす。
フレームデータの図解」の図1.6を参照。

 

HU3DM_changeModelOrigin モデル原点の変更。
モデル座標系はそのままに、モデルボディをモデル座標系に対して平行移動する。

[書式]

HU3DM_changeModelOrigin mid, x,y,z, opt

mid : モデルID
x,y,z : 移動量
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_scaleModel モデルの拡縮

[書式]

HU3DM_scaleModel mid, a,b,c, opt

mid : モデルID
a,b,c : xm,ym,zm方向の倍率
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

[備考]

倍率を負にすれば鏡像や反転像を作れる

 

HU3DM_rotateModelAroundMAxis モデルボディのみの回転。
モデル座標系はそのままに、モデルボディをモデル座標系に対して回転させる。
回転はロール・ピッチ・ヨーで表現する。この順に回転させる。

[書式]

HU3DM_rotateModelAroundMAxis mid, r,p,y, opt

mid : モデルID
r,p,y : ロール,ピッチ,ヨー
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

HU3DM_rotateModelAroundMAxis2 モデルボディのみの回転。
モデル座標系はそのままに、モデルボディをモデル座標系に対して回転させる。
「上」を表すベクトル(upベクトル)と注視点によって姿勢を決定する。
回転前のモデル座標軸をxm0,ym0,zm0とする。

[書式]

HU3DM_rotateModelAroundMAxis2 mid, a,b,c, x,y,z, opt

mid : モデルID
a,b,c : upベクトルのxm0,ym0,zm0成分
x,y,z : 注視点のxm0,ym0,zm0成分
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1,2) = (成功,数学的エラー,引数不正)

[備考]

モデル原点→注視点ベクトルがupベクトルと平行な場合は処理できない。

 

HU3DM_rotateModelAroundMAxis3 モデルボディのみの回転。
モデル座標系はそのままに、モデルボディをモデル座標系に対して回転させる。
常に回転前のモデル座標系を基準系としてモデルボディを回転させる。

[書式]

HU3DM_rotateModelAroundMAxis3 mid, θ,φ,ψ, opt

mid : モデルID
θ,φ,ψ : 回転角 (※解説参照)
opt : パーツの幾何パラメータ計算スイッチ。(0,other) = (計算しない,する)。詳しくは「< モデルの幾何操作 >」を参照。

[実行後のstatの値]

(0,1) = (成功,引数不正)

[解説]

モデル座標系の座標軸をxm,ym,zmで表すとする。
モデル座標系のコピーを作成(「コピー座標系」)し、軸をxm1,ym1,zm1とする。この時点では両者は一致している。
モデルボディを一旦モデル座標系から切り離し、コピー座標系に渡す。
まずxm1,ym1,zm1をxmまわりにθ、次にym回りにφ、最後にzmまわりにψ回転させる。
そしてモデルボディをコピー座標系から切り離し、元のモデル座標系に渡す。

 

HU3DM_inspectModelStruct モデル構造体の検査。
ユーザーにファイルからロードさせたモデル等の、信頼できないモデルのチェックに使うと良い。

[書式]

HU3DM_inspectModelStruct MSTRUCT_INT, MSTRUCT_DBL, ECODE

MSTRUCT_INT : int体
MSTRUCT_DBL : double体
ECODE : エラーコードを格納する1次元4要素int型配列

[実行後のstatの値]

(0,1) = (正常,異常)

[備考]

エラーが発見されると直ちに検査を中断して本命令の呼び出し元に返るので、複数のエラーを同時に検出することはできない。

[エラーコード]

 以下の説明では要素(i) (i=0,1,2,3) の値を ei と表し、エラーコードを e0.e1.e2.e3 と表現することにする。

 e0 はエラーのある構造体の種類を記録する。(0,1,2,3) = (エラー無し, int体異常, double体異常, 両方異常)
e0=0 の場合はe2,e3は意味を持たない。(0がセットされる)

< -1≦e1≦4 の場合 >

-1 : 配列のサイズが異常
0 : パーツIDの上制限に対して配列の1次元枝数が不足している
1 : パーツのzソートスイッチの値が不正
2 : モデルが申告した「保有するパーツ数」が実際に検査した数と合わない。このとき、e3 = (0,1) = (実際のパーツが多すぎる,少なすぎる)。
3 : 光の効果の適用スイッチの値が不正
4 : 可視/不可視スイッチ〃

< e1=5 の場合 >

エラーチェックに最初に引っかかったパーツのIDが e2 に格納され、e3 にその理由が次に示す値で格納される。

0 : パーツの有無の情報が不正。(0,1どちらでもない)
4 : 描画オプション1の値が不正。
5 : 不透明度の値が不正〃
6 : 光沢度〃
7 : 単色の場合のr,g,b色が不正
8 : 透過色有効スイッチの値が不正
9 : 透過色のr,g,b値〃
10 : 第1,2,4頂点が同一直線上にある

 

HU3DM_loadModelFromFile モデルファイルのロード。
モデル構造体のint,double体の配列データをファイルからロードし、そのモデルが依存するテクスチャ画像ファイルの情報も取得する。

[書式]

HU3DM_loadModelFromFile Path, MSTRUCT_INT,MSTRUCT_DBL, TexInfo, ECODE

Path : モデルファイルのパス (※カレントディレクトリからの相対パスでよい)
MSTRUCT_INT : int体配列のロード先変数。
MSTRUCT_DBL : 〃double
TexInfo : テクスチャ画像ファイルの情報を受け取る文字列型配列 (※初期化不要)
ECODE : モデル構造体のエラーのコードを格納する1次元4要素int型配列。構造は「HU3DM_inspectModelStruct」命令のそれと同じ。

< TexInfoの構造 >

文字列型(n+1,6)配列。ただし n はそのモデルが依存するテクスチャ画像ファイルの個数。
数値もすべて文字列で表現されていることに注意。
要素(0,0)にはモデルが依存するテクスチャ画像ファイルの個数が格納される。
要素(i+1,*) (i=0,1,2, ...) については*の各値とそれに対応する内容は次の通り。

0 : 画像ファイルのパス (※ モデルファイルのあるディレクトリを基準とした相対パス)
1,2 : 画像の幅,高さ
3 : 希望読み込み先ウィンドウID
4,5 : 希望読み込み先座標

[実行後のstatの値]

(0,1) = (成功,データが不正)

stat = 2 の場合は ECODE にエラーの詳細が記録される。

 

HU3DM_saveModelIntoFile モデルファイルの出力

[書式]

HU3DM_saveModelIntoFile Path, MSTRUCT_INT,MSTRUCT_DBL, TexInfo

Path : モデルファイルのパス (※カレントディレクトリからの相対パスでよい)
MSTRUCT_INT, MSTRUCT_DBL : モデル構造体int体,double体
TexInfo : テクスチャ画像ファイルの情報を格納した文字列型配列。構造は「HU3DM_loadModelFromFile」命令のそれと同じ。

[実行後のstatの値]

(0,1) = (成功,データが不正)

[備考]

ほとんどエラーチェックをしていない。不正なパラメータは致命傷になる。

HU3DM_cnvWpos2Mpos ワールド座標(xw,yw,zw)からモデル座標系座標(xm,ym,zm)への変換

[書式]

HU3DM_cnvWpos2Mpos x,y,z, mid, relpos

x,y,z : ワールド座標
mid : モデルID
relpos : 結果を受け取る変数。relpos = xm,ym,zm

[実行後のstatの値]

(0,1) = (成功,引数不正)

 

 

< 第二水準 >

index

 

ルーチン名 説明
HU3DM_common_data_array_scaling2 2次元配列の拡縮

[書式]

HU3DM_common_data_array_scaling2 TGTARRY, l,m

TGTARRY : ターゲット配列
l,m : 拡縮後の各次元方向の長さ

[備考]

エラーチェックを省いている

 

HU3DM_common_data_array_scaling3 3次元配列の拡縮

[書式]

HU3DM_common_data_array_scaling3 TGTARRY, l,m,n

TGTARRY : ターゲット配列
l,m,n : 拡縮後の各次元方向の長さ

[備考]

エラーチェックを省いている

 

HU3DM_common_data_array_QuickSort 1次元配列のクイックソート
区間を指定できる。
他の1次元配列を巻き添えにしてソートする。

[書式]

HU3DM_common_data_array_QuickSort TGTARRY,ATTENDANT , opt, s,e

TGTARRY : ターゲット配列
ATTENDANT : 付き添い配列
opt : 整列オプション(0,other)=(昇順,降順)
s,e : 開始,終了インデックス

[備考]

エラーチェックを省いている。引数の不正は致命傷になる。
要素数1以下のデータはソートできない。

 

HU3DM_calcPartGeoParamInModelInWorldStruct ワールド構造体に属するモデルの1パーツの幾何パラメータを設定する。
既に決定されているモデルの姿勢情報に従う。

[書式]

HU3DM_calcPartGeoParamInModelInWorldStruct mid,pid

mid : モデルID
pid : パーツID

[備考]

エラーチェックを省いている。引数の不正は致命傷になる。

 

HU3DM_calcModelGeoParamInWorldStruct ワールド構造体に属するあるモデルの全てのパーツ幾何パラメータを設定する。
既に決定されているモデルの姿勢情報に従う。

[書式]

HU3DM_calcModelGeoParamInWorldStruct mid

mid : モデルID

[備考]

エラーチェックを省いている。引数の不正は致命傷になる。

 

HU3DM_zSortVisibleModelsInWorldStruct ワールド構造体に属する全ての可視モデルをz優先度を考慮してzソートする。
結果はモデルIDの配列で与えられる。IDは先頭から順に並んでおり、前方のものから順に描画すればよい。

[書式]

HU3DM_zSortVisibleModelsInWorldStruct midList

midList : 結果を格納する配列

[実行後のstatの値]

描画すべきモデルの個数

[備考]

エラーチェックを省いている。引数の不正は致命傷になる。
midListの要素数を十分量確保しておくと少し高速になる。

HU3DM_zSortPartsInModelInWorldStruct ワールド構造体に属する指定されたモデルのパーツをzソートする。
結果はパーツIDの配列で与えられる。IDは先頭から順に並んでおり、前方のものから順に描画すればよい。

[書式]

HU3DM_zSortPartsInModelInWorldStruct mid, pidList

mid : モデルID
pidList : 結果を格納する配列

[実行後のstatの値]

描画すべきパーツの個数

[備考]

エラーチェックを省いている。引数の不正は致命傷になる。
pidListの要素数を十分量確保しておくと少し高速になる。

 

HU3DM_zSortAllVisiblePartsInWorldStruct ワールド構造体に属する全ての可視パーツをzソートする。
結果はモデルIDとパーツIDを組み合わせたIDの配列で与えられる。
IDは先頭から順に2要素ずつの区切りで並んでおり、前方のものから順に描画すればよい。
要素(i) (i=0,1,2,...)はi番目に描画すべきパーツの情報を保持する。
上位2バイトがモデルID、下位2バイトがパーツIDである。

[書式]

HU3DM_zSortAllVisiblePartsInWorldStruct mpidList

実行後のstatの値]

描画すべきパーツの個数

[備考]

エラーチェックを省いている。引数の不正は致命傷になる。
pidListの要素数を十分量確保しておくと少し高速になる。

 

HU3DM_getPointImage ワールド内の指定された点がカメラの有効投影面に像を作るかどうか、また、作るならその情報を求める。
結果は配列で与えられる。
要素(i)について、各iとそれに対応する情報は次の通り。

0 : 映るかどうか。(0.0,1.0)= 映(らない,る)
1,2,3 : 像のワールド座標
4 : 像のR値 (網膜原点から像までの網膜上における最短経路の長さ)
5 : 像のcosθ,sinθ値 (θは網膜原点から「像の、網膜標準接平面への正射影」へ向かうベクトルと xsrtp の正の向きの成す角)。R = 0 の場合は両方とも0とする。
7,8 : 像のHSPウィンドウ上での座標



[書式]

HU3DM_getPointImage x,y,z, RSLT

x,y,z : 点のワールド座標
RSLT : 結果を格納する1次元9要素配列

 

HU3DM_photoOnePartInModelInWorldStruct ワールド構造体に属するモデルのパーツを描画する。

[書式]

HU3DM_photoOnePartInModelInWorldStruct midplus,pidplus, opt

midplus : モデルID+1
pidplus : パーツID+1
opt : 光の効果の適用スイッチ (0,1)=(off,on)

[実行後のstatの値]

(0,1) = (映ならかった,映った)

[備考]

エラーチェックを省いている。引数の不正は致命傷になる。
pidListの要素数を十分量確保しておくと少し高速になる。
描画先ウィンドウは事前に設定しておくこと。

 

HU3DM_common_geo_rollPitchYaw 与えられた直行座標系単位ベクトルを回転させる。
ロール・ピッチ・ヨーで表現。この順に回転。

[書式]

HU3DM_common_geo_rollPitchYaw vi,vj,vk, r,p,y

vi,vj,vk : x,y,z単位ベクトル。それぞれ、(0),(1),(2)に上位座標系成分をx,y,z入れておく。
r,p,y : roll,pitch,yaw 角

 

HU3DM_common_geo_orthonormalize3vectors 与えられた3つのベクトルを正規直交化する。

[書式]

HU3DM_common_geo_orthonormalize3vectors v

v : ベクトルの成分を保存する1次元9要素double型配列。
    x1,y1,z1,x2,y2,z2,x3,y3,z3 の順で格納。
    (x1,y1,z1)が基準となる。
    結果はこの変数に返る。

[実行後のstatの値]

(0,1) = (成功,数学的エラー)

[備考]

3つのベクトルが一次独立でない場合、数学的エラーになる。

 

HU3DM_common_geo_Slv3x3SLE 解が1つに定まるような3元連立一次方程式 Ax=b を解く

[書式]

HU3DM_common_geo_Slv3x3SLE A,b,x

A : 係数行列。A = a11,a12,a13,a21,a22, ..., a33
b : 定数項ベクトル
x : 解を受け取る変数。 x = x1,x2,x3

[実行後のstatの値]

(0,1) = (成功, det(A)=0により計算不可)

[備考]

解はdouble型で返る

 

 


< 本モジュールを使うプログラムの一般的な構成 >

本モジュールを使うプログラムの一般的な構成はおよそ次のようになる。ユーザーの都合で適宜工夫,変更するのがよい。

*はラベルを表す。

*Boot

プログラム冒頭で初期設定を行う。この例ではここで多くのパラメータを決めてしまっているが、ダイナミックに変更することも可能。

  • モジュールの初期化。「HU3DM_init」を使う。

  • 描画中心,半径の設定。「HU3DM_setDrawCenterOnWindow」,「HU3DM_setDrawCircleRadius」を使う。

  • テクスチャを使用する場合は準備しておく。(bufferにロード)。「HU3DM_setTexSrcWnd」を使って素材ウィンドウを指定しておく。

  • 光線の準備。「HU3DM_setRays」を使う。

  • モデルIDの上制限の設定。「HU3DM_setModelIDUpperLimitPerWorld」を使う。普通はこのプログラムで使用される最大のモデルIDを設定しておく。ただし、ダイナミックに変更することも可能。

  • パーツIDの上制限の設定。「HU3DM_setPartIDUpperLimitPerModelInWorldStruct」を使う。普通はこのプログラムのワールドで使用される最大のパーツIDを設定しておく。ただし、ダイナミックに変更することも可能。

  • ポリゴン描画直前後コールバックの設定。「HU3DM_setPDCBL 」を使う。

*UserInterface

ユーザーインターフェース。メニュー画面等。

*MakeModels

モデルの作成。

まずモデル構造体を作る。そして作ったモデルを「HU3DM_importModelToWorldStruct」でワールドにインポートする。

モデル構造体を用意するには3つの方法がある。

@ パーツを一つ一つ手打ちする。
A モデル形状に数学的特徴がある場合はループ処理でパーツを作成する。(パラボラや巻き貝、その他色々。)。特に、直方体,正多角形,角柱,角錐,球については形状データの生成命令が用意されている。
B モデル構造体をファイルからロードする。

他にもモデルの変形等、様々な命令が用意されている。

*Show

描画を行う。アニメーションならループを使えばよい。

カメラの操作のために次の命令が用意されている。

モデルの操作のために次の主要な命令が用意されている。

撮影のために次の主要な命令が用意されている。

ユーザーの工夫次第で様々なことができる。また、本モジュールの内部変数にアクセスすれば高度な操作も可能。

*PDCB1

ポリゴン描画直前コールバック。

*PDCB2

ポリゴン描画直後コールバック。