1. TOP
  2. OMRON
  3. NX/NJシリーズ
  4. 計算
  5. 3D

一覧


シンボル

2点の距離 (distance3D)

空間座標上の2点の距離を算出

func_Distance3D
入力
pointA
点A [x,y,z]
pointB
点B [x,y,z]
出力
distance
2点間の距離

egDistance3D
入力
A
[8, 2, 2]
B
[2, 7, 9]
出力
distance
10.488

計算式

\[ distance = \sqrt{(B_x-A_x)^2+(B_y-A_y)^2+(B_z-A_z)^2} \]


3点を通る円の中心 (getCenter3D)

空間の3点を通る円の中心を算出

func_GetCenter3D
入力
A
点A [x,y,z]
B
点B [x,y,z]
C
点C [x,y,z]
出力
P0
中心 [x,y,z]

egGetCenter3D
入力
A
[0, 0, 2]
B
[1, 0, 0]
C
[0, 1, 2]
出力
P0
[0.5, 0.5, 1.0]

計算式

\begin{align} \overrightarrow{AB}=& \begin{pmatrix} B_x-A_x \\ B_y-A_y \\ B_z-A_z \end{pmatrix} \\ \overrightarrow{AC}=& \begin{pmatrix} C_x-A_x \\ C_y-A_y \\ C_z-A_z \end{pmatrix} \\ \overrightarrow{ABAC}=&\overrightarrow{AB}\times \overrightarrow{AC} \\ \end{align} 3元連立方程式を解きます \[ \begin{bmatrix} 2AB_x & 2AB_y & 2AB_z \\ 2AC_x & 2AC_y & 2AC_z \\ ABAC_x & ABAC_y & ABAC_z \end{bmatrix} \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \begin{bmatrix} B^2-A^2 \\ C^2-A^2 \\ ABAC\circ A \end{bmatrix} \] \(\times \) は外積(クロス積)、\(\circ \) はアダマール積(成分ごとの積)


X Y Z 軸で回転 (matRotateXYZ)

空間の3点を通る円の中心を算出

X軸で回転

Y軸で回転

Z軸で回転

func_matRotateXYZ
入力
point
回転前の座標 [x,y,z]
axis
回転軸 0=X 1=Y 2=Z
angle
回転角度
出力
out
移動後の座標 [x,y,z]

egGetCenter3D
入力
point
[1.2, 0.8, 0.5]
axis
0(X軸)
angle
270.0
出力
out
[1.2, 0.5, -0.8]

計算式

X軸周り \[ out= \begin{bmatrix} 1 & 0 & 0 \\ 0 & cos{\theta} & -sin{\theta} \\ 0 & sin{\theta} & cos{\theta} \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} \] Y軸周り \[ out= \begin{bmatrix} cos{\theta} & 0 & sin{\theta} \\ 0 & 1 & 0 \\ -sin{\theta} & 0 & cos{\theta} \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} \] Z軸周り \[ out= \begin{bmatrix} cos{\theta} & -sin{\theta} & 0 \\ sin{\theta} & cos{\theta} & 0 \\ 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} \]


オイラー角での回転 (Euler)

オイラー角を回転行列に変換(EulerToMatrix)して回転(matRotate3D)

func_matRotate3D
入力
point
回転前の座標 [x,y,z]
mat
回転行列
出力
out
移動後の座標 [x,y,z]

# この動画は計算の手順をイメージするもので実際の計算は最初の位置から最後の位置を直接算出します

egmatRotate3D
EulerToMatrix
入力
EulerAngles
[30,30,0]
order
XYZ
出力
mat
行列
matRotate3D
入力
point
[1.0, 1.0, 1.0]
mat
行列
出力
out
[1.37, 0.68, 0.82]

計算式

\[ out= \begin{bmatrix} m00 & m01 & m02 \\ m10 & m11 & m12 \\ m20 & m21 & m22 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} \]


クォータニオンで回転 (qtRotate)

func_qtRotate
入力
vector
回転軸の方向ベクトル [x,y,z]
point
回転前の座標 [x,y,z]
angle
回転角度
出力
out
移動後の座標 [x,y,z]

func_qtRotate
入力
vector
[-0.2, 1.0, 1.0]
point
[1.2, 1.0, 0.5]
angle
270.0
出力
out
[0.227, -0.293, 1.598]

計算式

元のベクトル \[ Q1= \begin{bmatrix} q_w \\ q_x \\ q_y \\ q_z \\ \end{bmatrix} = \begin{bmatrix} 0 \\ x \\ y \\ z \\ \end{bmatrix} = \begin{bmatrix} 0 \\ point.x \\ point.y \\ point.z \\ \end{bmatrix} \] 回転軸(単位ベクトル) \[ T= \begin{bmatrix} vector.x \\ vector.y \\ vector.z \\ \end{bmatrix} \] 回転を表すクォータニオン \[ R= \begin{bmatrix} q_w \\ q_x \\ q_y \\ q_z \\ \end{bmatrix} = \begin{bmatrix} cos\frac{\theta}{2} \\ sin\frac{\theta}{2} T_x \\ sin\frac{\theta}{2} T_y \\ sin\frac{\theta}{2} T_z \\ \end{bmatrix} \] 回転の計算
\[ out = R \times Q1 \times \bar{R} \]


螺旋 (spiral)


func_qtRotate
入力
angle
回転角度
dx
1周で増加するX軸方向の距離
dz
1周で増加するZ軸方向の距離
stype
種類
出力
out
移動後の座標 [x,y,z]

コイル

半径10で1回転にZ軸に10上に伸びるコイル形状の座標を求める例です
0度から1800度までを計算すると上記の「コイル」の図形が描けます

egSpiral
入力
angle
0から1800
dx
10.0
dz
10.0
stype
0
出力
out
0-1800度の座標 [x,y,z]

  • 等間隔で広がる螺旋
    上記の【例 コイル】のstypeを1に変更すると「等間隔で広がる」の図形が描けます
  • 平方根で広がる螺旋
    上記の【例 コイル】のstypeを2に変更すると「平方根で広がる」の図形が描けます
  • 指数関数で広がる螺旋
    上記の【例 コイル】のstypeを3に変更すると「指数関数で広がる」の図形が描けます

計算式

\begin{align} \theta = \frac{\pi}{180} \times Angle \\ r= \frac{dx}{360} \\ h= \frac{dz}{360} \end{align} コイル \begin{align} x= r \times \cos\theta \\ y= r \times \sin\theta \\ z= h \times Angle \end{align} 等間隔 \begin{align} x= r\theta \times cos\theta \\ y= r\theta \times sin\theta \\ z = h \times Angle \end{align} 平方根 \begin{align} x= r \sqrt{\theta} \times cos\theta \\ y= r \sqrt{\theta} \times sin\theta \\ z = h \times Angle \end{align} 指数関数 \begin{align} a= 1.1 \\ x= r \times a^{\theta} \times cos\theta \\ y= r \times a^{\theta} \times sin\theta \\ z = h \times Angle \end{align}

この記事へのコメント