NatureUtil¶
自然表現用ユーティリティクラス
Constructors¶
new NatureUtil()¶
new NatureUtil():
NatureUtil
Returns¶
Properties¶
DEG2RAD¶
staticreadonlyDEG2RAD:number=0.017453292519943
RAD2DEG¶
staticreadonlyRAD2DEG:number=57.29577951308232
epsilon¶
staticreadonlyepsilon:number=0.000001
Methods¶
calcTrianglesCenterBBoxArea()¶
staticcalcTrianglesCenterBBoxArea(vertices,indices,stride,offset,origin):number[]
三角板配列の中心、BBox、面積の計算 AbstractPolygonEntity.PrimitiveProducer.UpdatePrimitiveMesh(), AbstarctPolygonEntity.FlakePrimitiveProducer() の vertices, indices 三角板配列から計算
Parameters¶
| Parameter | Type | Description |
|---|---|---|
vertices |
Float32Array<ArrayBufferLike> |
三角板頂点配列 |
indices |
Uint32Array<ArrayBufferLike> |
インデックス配列 |
stride |
number |
三角板頂点配列の頂点ストライド |
offset |
number |
三角板頂点配列の頂点オフセット |
origin |
Vector3 |
vertices の原点座標 |
Returns¶
number[]
[center_x, center_y, center_z, min_x, min_y, min_z, max_x, max_y, max_z, area_sum]
calcWaveVectorInMLOCS()¶
staticcalcWaveVectorInMLOCS(angle_degree,scale,dst):Vector3
MLOCS座標系での波の方向をx軸からの角度で生成する
Parameters¶
| Parameter | Type |
|---|---|
angle_degree |
number |
scale |
number |
dst |
Vector3 |
Returns¶
createAlignedNeighborGOCS()¶
staticcreateAlignedNeighborGOCS(align_size,vec):Vector3
AlignSize単位の格子点集合の中で入力座標の近傍の座標(floorで得られる格子点)を返す
Parameters¶
| Parameter | Type |
|---|---|
align_size |
number |
vec |
Vector3 |
Returns¶
createFlipYMatrix()¶
staticcreateFlipYMatrix(dst):Matrix
Y軸反転マトリックスの作成 flipYMatrix = ( 1, 0, 0, 0 ) ( 0, -1, 0, 0 ) ( 0, 0, 1, 0 ) ( 0, 0, 0, 1 )
Parameters¶
| Parameter | Type |
|---|---|
dst |
Matrix |
Returns¶
createMirrorMatrix()¶
staticcreateMirrorMatrix(plane,dst):Matrix
平面式planeに対する鏡像変換マトリックスの作成 plane = ( n1, n2, n3, -L ) n = (n0, n1, n2): 面の法線 L: 面と原点との距離 MirroMatrix = ( 1-2n1n1, -2n1n2, -2n1n3, 2n1L ) ( -2n2n1, 1-2n2n2, -2n2n3, 2n2L ) ( -2n3n1, -2n3n2, 1-2n3n3, 2n3L ) ( 0, 0, 0, 1 )
Parameters¶
| Parameter | Type |
|---|---|
plane |
Vector4 |
dst |
Matrix |
Returns¶
createMirrorViewToGOCS()¶
staticcreateMirrorViewToGOCS(water_plane,org_view_to_gocs,dst):Matrix
MirrorViewToGOCS Matrix = mirror * org_view_to_gocs * yflip M^w_{m'c}: 右手系鏡像カメラ座標系からワールド座標系への変換マトリクス 右手系鏡像カメラ用モデルビューマトリックスの逆行列 M^{modelview_mirror_flip}^{-1}
Parameters¶
| Parameter | Type |
|---|---|
water_plane |
Vector4 |
org_view_to_gocs |
Matrix |
dst |
Matrix |
Returns¶
createViewToAlignGOCS()¶
staticcreateViewToAlignGOCS(align_size,view_to_gocs,model_to_gocs,dst):Matrix
view_to_gocs と obj_to_gocs から obj 用 viwe_to_aligned_gocs を作成
vx^g : GOCS成分で書かれたViewCSのx基底ベクトル vy^g : GOCS成分で書かれたViewCSのy基底ベクトル vz^g : GOCS成分で書かれたViewCSのz基底ベクトル vo^g : GOCS成分で書かれたViewCSの原点ベクトル
(vx.x^g vy.x^g vz.x^g vo.x^g)
view_to_gocs = (vx.y^g vy.y^g vz.y^g vo.y^g) (vx.z^g vy.z^g vz.z^g vo.z^g) ( 0 0 0 1)
gm^ag : モデル原点近傍のAlignGOCS格子点 = createAlignNeighborGOCS( A, mo^g );
(ret[0] ret[4] ret[ 8] ret[12]) = (vx.x^g vy.x^g vz.x^g vo.x^g - gm^ag) (ret[1] ret[5] ret[ 9] ret[13]) = (vx.y^g vy.y^g vz.y^g vo.y^g - gm^ag) (ret[2] ret[6] ret[10] ret[14]) = (vx.z^g vy.z^g vz.z^g vo.z^g - gm^ag) (ret[3] ret[7] ret[11] ret[15]) = ( 0 0 0 1)
Parameters¶
| Parameter | Type |
|---|---|
align_size |
number |
view_to_gocs |
Matrix |
model_to_gocs |
Matrix |
dst |
Matrix |
Returns¶
createViewToUV()¶
staticcreateViewToUV(view_to_clip,dst):null|Matrix
View to UV
p1 : [l, r] -> u : [0, 1] p2 : [b, t] -> v : [0, 1]
( -uw ) = R^{uv}( p1 ) ( -vw ) ( p2 ) ( -w ) ( p3 ) ( x ) ( x )
R^{uv} = ( n/(r-l) 0 l/(r-l) 0 ) ( 0 n/(t-b) b/(t-b) 0 ) ( 0 0 -1 0 ) ( 0 0 0 1 )
Parameters¶
| Parameter | Type |
|---|---|
view_to_clip |
Matrix |
dst |
Matrix |
Returns¶
null | Matrix
createViewToUVByLRBTNF()¶
staticcreateViewToUVByLRBTNF(lrbtnf,dst):Matrix
Parameters¶
| Parameter | Type |
|---|---|
lrbtnf |
number[] |
dst |
Matrix |
Returns¶
createVolumePlane()¶
staticcreateVolumePlane(camera):Vector4[]
視錘台の VolumePlane を取得 ViewCS (XcWc) = ( ( 2n)/(r-l) 0 (r+l)/(r-l) 0 )(Xw) (YcWc) ( 0 ( 2n)/(t-b) (t+b)/(t-b) 0 )(Yw) (ZcWc) ( 0 0 -(f+n)/(f-n) -(2fn)/(f-n) )(Zw) ( Wc) ( 0 0 -1 0 )( 1)
(XcWc) = ( m[00] m[01] m[02] m[03] )(Xw) (YcWc) ( m[10] m[11] m[12] m[13] )(Yw) (ZcWc) ( m[20] m[21] m[22] m[23] )(Zw) ( Wc) ( m[30] m[31] m[32] m[33] )( 1)
(XcWc) = ( m[ 0] m[ 4] m[ 8] m[12] )(Xw) (YcWc) ( m[ 1] m[ 5] m[ 9] m[13] )(Yw) (ZcWc) ( m[ 2] m[ 6] m[10] m[14] )(Zw) ( Wc) ( m[ 3] m[ 7] m[11] m[15] )( 1)
near = (m[ 3] + m[ 2], m[ 7] + m[ 6], m[11] + m[10], m[15] + m[14]) = (0, 0, -1 + (-(f+n)/(f-n)), 0 + (-(2fn)/(f-n))) = (0, 0, -1 - (f+n)/(f-n)), -(2fn)/(f-n)) = (0, 0, -(f-n)/(f-n) - (f+n)/(f-n)), -(2fn)/(f-n)) = -(2f/(f-n))(0, 0, 1, n)
far = (m[ 3] - m[ 2], m[ 7] - m[ 6], m[11] - m[10], m[15] - m[14]) = (0, 0, -1 - (-(f+n)/(f-n)), -(-(2fn)/(f-n)) ) = (0, 0, -(f-n)/(f-n) + (f+n)/(f-n)), (2fn)/(f-n) ) = (0, 0, (2n)/(f-n)), (2fn)/(f-n) ) = (2n/(f-n))(0, 0, 1, f)
left = (m[ 3] + m[ 0], m[ 7] + m[ 4], m[11] + m[ 8], m[15] + m[12]) = (0 + ( 2n)/(r-l), 0 + 0, -1 + (r+l)/(r-l), 0 + 0) = ((2n)/(r-l), 0, -(r-l)/(r-l) + (r+l)/(r-l), 0) = ((2n)/(r-l), 0, (2l)/(r-l), 0) = (2/(r-l))(n, 0, l, 0)
right= (m[ 3] - m[ 1], m[ 7] - m[ 5], m[11] - m[ 9], m[15] - m[13]) = (0 - 0, 0 - 0, -1 - (r+l)/(r-l), 0 - 0) = (-(2n)/(r-l), 0, -(r-l)/(r-l) - (r+l)/(r-l), 0) = (-(2n)/(r-l), 0, -(2r)/(r-l), 0) = -(2/(r-l))(n, 0, r, 0)
bottom= (m[ 3] + m[ 0], m[ 7] + m[ 4], m[11] + m[ 8], m[15] + m[12]) = (0 + 0, 0 + ( 2n)/(t-b), -1 + (t+b)/(t-b), 0 + 0) = (0, (2n)/(t-b), -(t-b)/(t-b) + (t+b)/(t-b), 0) = (0, (2n)/(t-b), (2b)/(t-b), 0) = (2/(t-b))(0, n, b, 0)
top = (m[ 3] - m[ 0], m[ 7] - m[ 4], m[11] - m[ 8], m[15] - m[12]) = (0 - 0, 0 - ( 2n)/(t-b), -1 - (t+b)/(t-b), 0 - 0) = (0, -(2n)/(t-b), -(t-b)/(t-b) - (t+b)/(t-b), 0) = (0, -(2n)/(t-b), -(2t)/(t-b), 0) = -(2/(t-b))(0, n, t, 0)
Parameters¶
| Parameter | Type |
|---|---|
camera |
Camera |
Returns¶
Vector4[]
getCameraDownRay()¶
staticgetCameraDownRay(camera):Ray
カメラ視線より少し下寄り方向の Ray を作成 GOCS
Parameters¶
| Parameter | Type |
|---|---|
camera |
Camera |
Returns¶
getCameraFovxyd()¶
staticgetCameraFovxyd(camera): [number,number,number]
カメラのキャンバスサイズと対角画角から横画角、縦画角、対角線画角[rad.]を取得する
Parameters¶
| Parameter | Type |
|---|---|
camera |
Camera |
Returns¶
[number, number, number]
[fox, fovy, fovd] [rad.]
getCameraGroundPosition()¶
staticgetCameraGroundPosition(camera,altitude):Vector3
カメラと地面との交点を取得 GOCS
Parameters¶
| Parameter | Type |
|---|---|
camera |
Camera |
altitude |
number |
Returns¶
getCameraPosition()¶
staticgetCameraPosition(camera):Vector3
カメラ位置を取得 GOCS
Parameters¶
| Parameter | Type |
|---|---|
camera |
Camera |
Returns¶
getCameraRay()¶
staticgetCameraRay(camera):Ray
カメラ方向のRayを作成 GOCS
Parameters¶
| Parameter | Type |
|---|---|
camera |
Camera |
Returns¶
getHorizontalPlane()¶
staticgetHorizontalPlane(pos,dst):Vector4
水平面の計算 GOCS
Parameters¶
| Parameter | Type |
|---|---|
pos |
Vector3 |
dst |
Vector4 |
Returns¶
getMoveFromMatrix()¶
staticgetMoveFromMatrix(m):Vector3
Matrix 第 4 列から移動ベクトルを取得
(m00 m01 m02 m03) (m[ 0] m[ 4] m[ 8] m[12]) (m10 m11 m12 m13) = (m[ 1] m[ 5] m[ 9] m[13]) (m20 m21 m22 m32) (m[ 2] m[ 6] m[10] m[14]) (m30 m31 m32 m33) ( 0 0 0 1)
Parameters¶
| Parameter | Type |
|---|---|
m |
Matrix |
Returns¶
getPointDistanceFromPlane()¶
staticgetPointDistanceFromPlane(plane,pt):number
平面と頂点との距離 法線方向が正、法線と逆方向は負となります。
Parameters¶
| Parameter | Type | Description |
|---|---|---|
plane |
Vector4 |
法線は正規化済みです。 |
pt |
Vector3 |
頂点 |
Returns¶
number
getProjectionMatrixParameter()¶
staticgetProjectionMatrixParameter(pm):null|number[]
opengl射影行列からl, r, b, t, n, fを取得する
Parameters¶
| Parameter | Type | Description |
|---|---|---|
pm |
Matrix |
: [i ] opengl射影行列 |
Returns¶
null | number[]
Returm¶
[lrbtnf] (XcWc) = ( ( 2n)/(r-l) 0 (r+l)/(r-l) 0 )(Xw) (YcWc) ( 0 ( 2n)/(t-b) (t+b)/(t-b) 0 )(Yw) (ZcWc) ( 0 0 -(f+n)/(f-n) -(2fn)/(f-n) )(Zw) ( Wc) ( 0 0 -1 0 )( 1)
(XcWc) = ( m[00] m[01] m[02] m[03] )(Xw) (YcWc) ( m[10] m[11] m[12] m[13] )(Yw) (ZcWc) ( m[20] m[21] m[22] m[23] )(Zw) ( Wc) ( m[30] m[31] m[32] m[33] )( 1)
(XcWc) = ( m[ 0] m[ 4] m[ 8] m[12] )(Xw) (YcWc) ( m[ 1] m[ 5] m[ 9] m[13] )(Yw) (ZcWc) ( m[ 2] m[ 6] m[10] m[14] )(Zw) ( Wc) ( m[ 3] m[ 7] m[11] m[15] )( 1)
1) n,fを求める m[22] = -(f+n)/(f-n) m[23] = -(2fn)/(f-n) より
-m[22] = ((1/n)+(1/f)) / ((1/n)-(1/f)) -m[23] = 2 / ((1/n)-(1/f))
(-1-m[22])(1/n)+(-1+m[22])(1/f) = 0 ( -m[23])(1/n)+( m[23])(1/f) = 2
((-1-m[22]) (-1+m[22])) (1/n) = (0) (( -m[23]) ( m[23])) (1/f) = (2)
行列式 = (-1-m[22])( m[23]) - (-1+m[22])( -m[23]) = -m[23]-m[22]m[23] - m[23] +m[22]m[23] = -2m[23]
(1/n) = ( m[23] ( 1-m[22]) ) (0) (1/f) (-1/2m[23])( m[23] (-1-m[22]) ) (2)
(1/n) = ( 2( 1-m[22]) ) (1/f) (-1/2m[23])( 2(-1-m[22]) )
(1/n) = ( ( 1-m[22]) ) (1/f) (-1/m[23])( (-1-m[22]) )
(1/n) = ( (-1+m[22]) / m[23] ) (1/f) ( ( 1+m[22]) / m[23] )
(n) = ( m[23] / (-1+m[22]) ) m[22]=0となるのはn=0のときだけなので常に分母!=0 (f) ( m[23] / ( 1+m[22]) )
n, fが計算された
2) l, rを求める m[00] = ( 2n)/(r-l) m[02] = (r+l)/(r-l) より
(m[00] )r + (-m[00] )l = 2n (m[02]-1)r + (-m[02]-1)l = 0
((m[00] ) (-m[00] )) r = (2n) ((m[02]-1) (-m[02]-1)) l = (0 ) 行列式 = m00 - (-m[00] )(m[02]-1) = -m[00]m[02] - m[00] + m[00]m[02] - m[00] = -2m[00]
(r) = ((-m[02]-1) m[00])(2n) (l) (-1/2m[00])((-m[02]+1) m[00])( 0)
(r) = ((-m[02]-1)2n) (l) (-1/2m[00])((-m[02]+1)2n)
(r) = ((m[02]+1)n) (l) (1/m[00])((m[02]-1)n)
(r) = ((m[02]+1)n)/(m[00]) (l) ((m[02]-1)n)/(m[00])
r, lが計算された
3) b, tを求める m[11] = ( 2n)/(t-b) m[12] = (t+b)/(t-b) より r,lを求めた時の式と相似な形をしているので
(t) = ((m[12]+1)n)/(m[11]) (b) ((m[12]-1)n)/(m[11])
t, bが計算された
(n) = ( m[23] )/(-1+m[22]) m[22]=0となるのはn=0のときだけなので常に分母!=0 (f) ( m[23] )/( 1+m[22]) (r) = ((m[02]+1)n)/( m[00]) m[00]=0となるのはn=0のときだけなので常に分母!=0 (l) ((m[02]-1)n)/( m[00]) (t) = ((m[12]+1)n)/( m[11]) m[11]=0となるのはn=0のときだけなので常に分母!=0 (b) ((m[12]-1)n)/( m[11])
getRayIntersectGroundPosition()¶
staticgetRayIntersectGroundPosition(ray,globe):undefined|Vector3
Rayと地面との交点を取得 GOCS
Parameters¶
| Parameter | Type |
|---|---|
ray |
Ray |
globe |
Globe |
Returns¶
undefined | Vector3
getWaveVectorInModelCS()¶
staticgetWaveVectorInModelCS(pos_model,model_to_gocs,wave_mlocs,dst):Vector3
MLOCS座標系での波の方向からモデル座標系での波の方向を計算する
Parameters¶
| Parameter | Type |
|---|---|
pos_model |
Vector3 |
model_to_gocs |
Matrix |
wave_mlocs |
Vector3 |
dst |
Vector3 |
Returns¶
getXBasisFromMatrix()¶
staticgetXBasisFromMatrix(m):Vector3
Matrix 第 1 列から X基底ベクトルを取得
(m00 m01 m02 m03) (m[ 0] m[ 4] m[ 8] m[12]) (m10 m11 m12 m13) = (m[ 1] m[ 5] m[ 9] m[13]) (m20 m21 m22 m32) (m[ 2] m[ 6] m[10] m[14]) (m30 m31 m32 m33) ( 0 0 0 1)
Parameters¶
| Parameter | Type |
|---|---|
m |
Matrix |
Returns¶
getYBasisFromMatrix()¶
staticgetYBasisFromMatrix(m):Vector3
Matrix 第 2 列から Y基底ベクトルを取得
(m00 m01 m02 m03) (m[ 0] m[ 4] m[ 8] m[12]) (m10 m11 m12 m13) = (m[ 1] m[ 5] m[ 9] m[13]) (m20 m21 m22 m32) (m[ 2] m[ 6] m[10] m[14]) (m30 m31 m32 m33) ( 0 0 0 1)
Parameters¶
| Parameter | Type |
|---|---|
m |
Matrix |
Returns¶
getZBasisFromMatrix()¶
staticgetZBasisFromMatrix(m):Vector3
Matrix 第 3 列から Z基底ベクトルを取得
(m00 m01 m02 m03) (m[ 0] m[ 4] m[ 8] m[12]) (m10 m11 m12 m13) = (m[ 1] m[ 5] m[ 9] m[13]) (m20 m21 m22 m32) (m[ 2] m[ 6] m[10] m[14]) (m30 m31 m32 m33) ( 0 0 0 1)
Parameters¶
| Parameter | Type |
|---|---|
m |
Matrix |
Returns¶
isBBoxAndVolumePlanesIntersecting()¶
staticisBBoxAndVolumePlanesIntersecting(bbox_gocs,gocs_to_view,volume_planes_viewcs):boolean
BBox が volume_planes と交差しているか否か ref.) 視錐台とAABBとの交差判定 https://edom18.hateblo.jp/entry/2017/10/29/112908
Parameters¶
| Parameter | Type | Description |
|---|---|---|
bbox_gocs |
[Vector3, Vector3] |
バウンディングボックス [GOCS] |
gocs_to_view |
Matrix |
GOCS -> ViewCS |
volume_planes_viewcs |
Vector4[] |
境界平面 [ViewCS] 法線は正規化済みです。 |
Returns¶
boolean
isInsideVolumePlane()¶
staticisInsideVolumePlane(volume_planes,x,y,z):boolean
VolumePlane の内側か否か
Parameters¶
| Parameter | Type |
|---|---|
volume_planes |
Vector4[] |
x |
number |
y |
number |
z |
number |
Returns¶
boolean
isMatrixSame()¶
staticisMatrixSame(m0,m1):boolean
Matrix 第 4 列に移動ベクトルをセット
(m00 m01 m02 m03) (m[ 0] m[ 4] m[ 8] m[12]) (m10 m11 m12 m13) = (m[ 1] m[ 5] m[ 9] m[13]) (m20 m21 m22 m32) (m[ 2] m[ 6] m[10] m[14]) (m30 m31 m32 m33) ( 0 0 0 1)
Parameters¶
| Parameter | Type |
|---|---|
m0 |
Matrix |
m1 |
Matrix |
Returns¶
boolean
isZero()¶
staticisZero(x):boolean
epsilonを考慮したゼロ判定
Parameters¶
| Parameter | Type |
|---|---|
x |
number |
Returns¶
boolean
setMoveToMatrix()¶
staticsetMoveToMatrix(m,mov):Matrix
Matrix 第 4 列に移動ベクトルをセット
(m00 m01 m02 m03) (m[ 0] m[ 4] m[ 8] m[12]) (m10 m11 m12 m13) = (m[ 1] m[ 5] m[ 9] m[13]) (m20 m21 m22 m32) (m[ 2] m[ 6] m[10] m[14]) (m30 m31 m32 m33) ( 0 0 0 1)
Parameters¶
| Parameter | Type |
|---|---|
m |
Matrix |
mov |
Vector3 |