2024年10月 8日(火) 15:33 JST

2012年度第5回GDL講習会

  • 2012年5月28日(月) 20:07 JST
  • 投稿者:
    ゲストユーザ

第5回「LIN_による立体トラス」

第5回GDL講習会では、第3回の講習で作成したメッシュを用いて立体トラスの骨組みを再現しました。

立体トラスを再現するため、「間隔が一様」であるメッシュを二つ用意します。ここで下のメッシュをZ軸方向にADDすることで調整する方法を取ると、二つのメッシュの間隔が端部と中央部で異なってしまいます。そこで左下図のように一つ目のメッシュの各座標の法線ベクトルを求め、一定の距離押し出すことでメッシュの間隔を一様にしました。

法線ベクトルは外積によって求めます。
a = ( a1 , a2 , a3 ) , b = ( b1 , b2 , b3 )のとき、( a2・b3 - a3・b2 , a3・b1 - a1・b3 , a1・b2 - a2・b1 )で定義されるa×bが法線ベクトルとなります。 今回はこの法線ベクトルに、自身の長さの逆数を掛けることで単位ベクトル化しました。

二つのメッシュの座標を適当に繋いで立体トラスの完成です。以下、解答例を掲載します。


DIM x[] , y[] , z[][] !!上のメッシュの座標
DIM u[] , v[] , w[][] !!下のメッシュの座標
n = 10

FOR i = 1 TO n
	FOR j = 1 TO n
		x[i] = ( i - ( 1 + n ) / 2 ) * ( ( 10 - 1 ) / ( n - 1 ) )
		y[j] = ( j - ( 1 + n ) / 2 ) * ( ( 10 - 1 ) / ( n - 1 ) )
		z[i][j] = -( x[i]^2 + y[j]^2 ) / 10
	NEXT j
NEXT i

FOR i = 1 TO n - 1
	FOR j = 1 TO n -1

		!!上のメッシュの座標の中点を求める
		px = ( x[i] + x[i+1] ) / 2
		py = ( y[j] + y[j+1] ) / 2
		pz = ( z[i][j] + z[i+1][j+1] ) / 2

		!!ベクトルaの成分
		ax = x[i] - x[i]
		ay = y[j+1] - y[j]
		az = z[i][j+1] - z[i][j]

		!!ベクトルbの成分
		bx = x[i+1] - x[i]
		by = y[j] - y[j]
		bz = z[i+1][j] - z[i][j]

		!!法線ベクトルa×bの成分
		vx = ay*bz - by*az
		vy = az*bx - bz*ax
		vz = ax*by - bx*ay

		!!自身のベクトル長
		t = 1 / SQR ( vx^2 + vy^2 + vz^2 )

		!!下のメッシュの座標
		u[i] = px + t * vx
		v[j] = py + t * vy
		w[i][j] = pz + t * vz

	NEXT j
NEXT i

!!一つ目のメッシュを描画
PEN 1

FOR i = 1 TO n - 1
	FOR j = 1 TO n
		LIN_ x[i] , y[j] , z[i][j] ,
			x[i+1] , y[j] , z[i+1][j]
	NEXT j
NEXT i

FOR i = 1 TO n
	FOR j = 1 TO n - 1
		LIN_ x[i] , y[j] , z[i][j] ,
			x[i] , y[j+1] , z[i][j+1]
	NEXT j
NEXT i

!!二つ目のメッシュを描画
PEN 5

FOR i = 1 TO n - 2
	FOR j = 1 TO n - 1
		LIN_ u[i] , v[j] , w[i][j] ,
			u[i+1] , v[j] , w[i+1][j]
	NEXT j
NEXT i

FOR i = 1 TO n - 1
	FOR j = 1 TO n - 2
		LIN_ u[i] , v[j] , w[i][j] ,
			u[i] , v[j+1] , w[i][j+1]
	NEXT j
NEXT i

!!二つのメッシュを繋ぐ処理
PEN 8

FOR i = 1 TO n - 1
	FOR j = 1 TO n - 1

		LIN_ u[i] , v[j] , w[i][j] ,
			x[i] , y[j] , z[i][j]

		LIN_ u[i] , v[j] , w[i][j] ,
			x[i+1] , y[j] , z[i+1][j]

		LIN_ u[i] , v[j] , w[i][j] ,
			x[i] , y[j+1] , z[i][j+1]

		LIN_ u[i] , v[j] , w[i][j] ,
			x[i+1] , y[j+1] , z[i+1][j+1]

	NEXT j
NEXT i

今回は「数式を取り入れたモデリングに慣れる」ことをテーマに取り組みました。数式を上手く利用して、自分の作りたいものを作れるよう訓練していきましょう。

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。