コンテンツにスキップ

NatureUtil

自然表現用ユーティリティクラス

Constructors

new NatureUtil()

new NatureUtil(): NatureUtil

Returns

NatureUtil

Properties

DEG2RAD

static readonly DEG2RAD: number = 0.017453292519943


RAD2DEG

static readonly RAD2DEG: number = 57.29577951308232


epsilon

static readonly epsilon: number = 0.000001

Methods

calcTrianglesCenterBBoxArea()

static calcTrianglesCenterBBoxArea(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()

static calcWaveVectorInMLOCS(angle_degree, scale, dst): Vector3

MLOCS座標系での波の方向をx軸からの角度で生成する

Parameters

Parameter Type
angle_degree number
scale number
dst Vector3

Returns

Vector3


createAlignedNeighborGOCS()

static createAlignedNeighborGOCS(align_size, vec): Vector3

AlignSize単位の格子点集合の中で入力座標の近傍の座標(floorで得られる格子点)を返す

Parameters

Parameter Type
align_size number
vec Vector3

Returns

Vector3


createFlipYMatrix()

static createFlipYMatrix(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

Matrix


createMirrorMatrix()

static createMirrorMatrix(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

Matrix


createMirrorViewToGOCS()

static createMirrorViewToGOCS(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

Matrix


createViewToAlignGOCS()

static createViewToAlignGOCS(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

Matrix


createViewToUV()

static createViewToUV(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()

static createViewToUVByLRBTNF(lrbtnf, dst): Matrix

Parameters

Parameter Type
lrbtnf number[]
dst Matrix

Returns

Matrix


createVolumePlane()

static createVolumePlane(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()

static getCameraDownRay(camera): Ray

カメラ視線より少し下寄り方向の Ray を作成 GOCS

Parameters

Parameter Type
camera Camera

Returns

Ray


getCameraFovxyd()

static getCameraFovxyd(camera): [number, number, number]

カメラのキャンバスサイズと対角画角から横画角、縦画角、対角線画角[rad.]を取得する

Parameters

Parameter Type
camera Camera

Returns

[number, number, number]

[fox, fovy, fovd] [rad.]


getCameraGroundPosition()

static getCameraGroundPosition(camera, altitude): Vector3

カメラと地面との交点を取得 GOCS

Parameters

Parameter Type
camera Camera
altitude number

Returns

Vector3


getCameraPosition()

static getCameraPosition(camera): Vector3

カメラ位置を取得 GOCS

Parameters

Parameter Type
camera Camera

Returns

Vector3


getCameraRay()

static getCameraRay(camera): Ray

カメラ方向のRayを作成 GOCS

Parameters

Parameter Type
camera Camera

Returns

Ray


getHorizontalPlane()

static getHorizontalPlane(pos, dst): Vector4

水平面の計算 GOCS

Parameters

Parameter Type
pos Vector3
dst Vector4

Returns

Vector4


getMoveFromMatrix()

static getMoveFromMatrix(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

Vector3


getPointDistanceFromPlane()

static getPointDistanceFromPlane(plane, pt): number

平面と頂点との距離 法線方向が正、法線と逆方向は負となります。

Parameters

Parameter Type Description
plane Vector4 法線は正規化済みです。
pt Vector3 頂点

Returns

number


getProjectionMatrixParameter()

static getProjectionMatrixParameter(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))

-m22 = ((1/n)+(1/f)) -m23 = 2

(-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) より

m00 = ( 2n) m02 = (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()

static getRayIntersectGroundPosition(ray, globe): undefined | Vector3

Rayと地面との交点を取得 GOCS

Parameters

Parameter Type
ray Ray
globe Globe

Returns

undefined | Vector3


getWaveVectorInModelCS()

static getWaveVectorInModelCS(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

Vector3


getXBasisFromMatrix()

static getXBasisFromMatrix(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

Vector3


getYBasisFromMatrix()

static getYBasisFromMatrix(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

Vector3


getZBasisFromMatrix()

static getZBasisFromMatrix(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

Vector3


isBBoxAndVolumePlanesIntersecting()

static isBBoxAndVolumePlanesIntersecting(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()

static isInsideVolumePlane(volume_planes, x, y, z): boolean

VolumePlane の内側か否か

Parameters

Parameter Type
volume_planes Vector4[]
x number
y number
z number

Returns

boolean


isMatrixSame()

static isMatrixSame(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()

static isZero(x): boolean

epsilonを考慮したゼロ判定

Parameters

Parameter Type
x number

Returns

boolean


setMoveToMatrix()

static setMoveToMatrix(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

Returns

Matrix