「ぎょーむ日誌」目次に戻る | KuboWeb top に戻る | twilog | atom

ぎょーむ日誌 2001-05-29

苦情・お叱りは, たいへんお手数かけて恐縮ですが, 久保 (kubo@ees.hokudai.ac.jp) までお知らせください.

2001 年 05 月 29 日 (火)

	class Gaze
	{
	private:
		static GazeId	current_id;
	protected:
		const GazeId	NewId( void ) { ....; return current_id++; }
		...
	};
	#include	"gaze.h"
	GazeId	Gaze::current_id( 0 );
	bool VitSphere::CheckHit( Gaze* gaze )
	{
		//  view_point
		//    o------------------------> view_direction (v)
		//     \)theta |
		//      \      | distance = diff_xyz.SquareScalar()
		//       \     |
		//        \    | r = distance * sin( theta )
		//         \   |   = distance * ( 1 - cos( theta )^2  )
		// diff_xyz \  |   = distance
		//           \ |     - ( diff_xyz . view_direction )^2 / ( v . v )
		//            \|     	
		//             X
		//	location (center of the sphere)
		...
	視点 O(x0, y0, z0) と視線ヴェクトルの成分は (a, b, c).
	「視線」の式をパラメトリックというんだから,

		t = ( x - x0 ) / a = ( y - y0 ) / b = ( z - z0 ) / c

	とか書いて,

		x = a * t + x0
		y = b * t + y0
		z = c * t + z0

	とするんだろう.つぎに球の中心 (xs, ys, zs) を通り,
	法線ヴェクトルが (a, b, c) の平面は

		a ( x - xs ) + b ( y - ys ) + c ( z - zs ) = 0

	となるから,上の式の ( x, y, z ) に「パラメトリック」表示
	の式を代入すると …… えーと 

		a ( a * t + x0 - xs ) + b ( b * t + y0 - ys )
			+ c ( c * t + z0 - zs ) = 0

	となって,直線と平面の交点P (これが最接近点) を表す t である
	tp は

		tp = ( a ( xs - x0 ) + b ( ys - y0 ) + c ( zs - z0 ) )
			/ ( a * a + b * b + c * c )

	であとは xp = a * tp + x0 というふうに (xp, yp, zp) が
	計算できる,と.

KuboLog | KuboWeb