[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:01347] Traditional Camera View Model



 


筒口と申します.

Java3D で, ピンホール・カメラモデルで視界を構築する手法についてお尋ねします.
チュートリアルによると,

	Transform3D t3d_camera = new Transform3D();
        t3d_camera.frustum(left, right, bottom, top, near, far);
	t3d_camera.lookAt( eye/*Point3d*/, to/*Point3d*/, up/*Vector3d*/ );

を用いればいいということなのですが, 生成結果が期待しているものとはかなり
異なってしまいます.
シーンは, 水平面上(XZ平面)に長方形の図形があり,
それを斜め上方(+Z, +Y)から見ているもので, 期待している結果は,
画面の中央に台形の図形が(まるごと)含まれているものです.
OpenGL での描画では期待通りの出力が出ます.

恐らくは,何か必要なメソッドを呼び忘れているのだろうと思うのですが,
まだ Java3D を始めてから日が浅いため, 根本的な間違いを
しでかしているかも知れません.
以下に, OpenGL(抜粋), ViewTest.html, ViewTest.java のソースファイルを
添えますので, おかしい点をご教授頂ければ幸いです.
----------
 筒口 拳 [Ken -KENT- Tsutsuguchi] <kent@xxxxxxxxxxxxxxxxxxxx>

 --- OpenGL --- from here --- from here --- from here ---
(注: 以下の関数を描画関数として指定する)
void displayFunc( void ) {

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glFrustum(-2.375814,2.868131,-2.742890,1.190069,4.799551,23.916407);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt(2.375814, 2.742890, 4.799551,
	     2.375814, 2.742890, 0.000000,
	     0.0, 1.0, 0.0 );
   drawScene();		// -> ポリゴンを描画する関数をコール
}
(注:) 描画対象のポリゴンは以下を頂点とする長方形.
	(0.376909f, 0.262197f, -19.116856f),
	(5.194783f, 0.262197f, -19.116856f),
	(5.194783f, 0.262197f,   0.000000f),
	(0.376909f, 0.262197f,   0.000000f),
 --- OpenGL --- to here --- to here --- to here ---

 --- ViewTest.html --- from here --- from here --- from here ---
<HTML><HEAD><TITLE>ViewTest</TITLE></HEAD>
<BODY>
 


<APPLET code="ViewTest.class" width="640" height="480" codebase="."></APPLET>
</BODY></HTML>
 --- ViewTest.html --- to here --- to here --- to here ---

 --- ViewTest.java --- from here --- from here --- from here ---
/*
 *	ViewTest.java
 */
import java.applet.*;
import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;

public class ViewTest extends Applet {

    /** --- Constructor --- */ 
    public ViewTest() {
	this.setLayout(new BorderLayout());
    }
    /** --- Applet Initializer --- */
    public void init() {
        VirtualUniverse virtual_universe = new VirtualUniverse();
        Locale locale = new Locale( virtual_universe );

        BranchGroup scene_root = this.sceneRoot();	// Scene を作成
        locale.addBranchGraph( scene_root );

	BranchGroup view_root = this.viewRoot();	// View を作成
        locale.addBranchGraph( view_root );
    }
    /** --- View の作成 --- */
    public BranchGroup viewRoot() {

        BranchGroup view_root = new BranchGroup();	// returns this.

	// View
        View view = new View();
        ViewPlatform view_platform = new ViewPlatform();
        view.attachViewPlatform( view_platform );
        view.addCanvas3D( new Canvas3D( null ) );
	view.setPhysicalBody( new PhysicalBody() );
	view.setPhysicalEnvironment( new PhysicalEnvironment() );
	// 次の行をつけると何も見えなくなる
	//view.setCompatibilityModeEnable(true); 

        TransformGroup tfg_camera = new TransformGroup();
        Transform3D    t3d_camera = new Transform3D();

	// Origin is Eye.
        t3d_camera.frustum(-2.375814, 2.868131, -2.742890,  1.190069,
			    // 4.799551,  23.916407+30.0 );
			    0.001,  100.00);
	// Origin is World Coordinates.
	t3d_camera.lookAt(new Point3d(2.375814, 2.742890, 4.799551),
			  new Point3d(2.375814, 2.742890, 0.000000),
			  new Vector3d(0.0, 1.0, 0.0) );

	//view.setCompatibilityModeEnable(true);
	//view.setVpcToEc(t3d_camera );		これもつけると何も見えない.
	tfg_camera.setTransform( t3d_camera );
        tfg_camera.addChild( view_platform );

	// view-BranchGraph にカメラ行列変換をぶら下げる
        view_root.addChild( tfg_camera );

	// Canvas3D をすでに作成されたフレームにバインドする
	this.add( view.getCanvas3D(0), "Center" );
	return view_root;
    }
    /** --- 描画対象となるシーングラフの作成 --- */
    private BranchGroup sceneRoot() {

        BranchGroup scene_root = new BranchGroup();	// returns this.
        TransformGroup scene_group = new TransformGroup();

	// 描画対象
        Shape3D polygon = new Shape3D();
	Point3f[] vertex = {
	    new Point3f(0.376909f, 0.262197f, -19.116856f),
	    new Point3f(5.194783f, 0.262197f, -19.116856f),
	    new Point3f(5.194783f, 0.262197f,   0.000000f),
	    new Point3f(0.376909f, 0.262197f,   0.000000f) };

        Color3f[] colors = {
	    new Color3f( 1.0f, 0.0f, 0.0f ),
	    new Color3f( 0.0f, 1.0f, 0.0f ),
	    new Color3f( 0.0f, 0.0f, 1.0f ),
	    new Color3f( 1.0f, 0.0f, 1.0f ) };

	QuadArray geom =
	    new QuadArray( vertex.length/*4*/,		// number;
			   GeometryArray.COORDINATES |
			   GeometryArray.COLOR_3/*RGB[0.0-1.0]*/);
	geom.setCapability(Geometry.ALLOW_INTERSECT);
	geom.setCoordinates(0, vertex);		// From 0-th
        geom.setColors( 0, colors );
        polygon.setGeometry( geom );

	// SceneGroup に Shape3D を追加
        scene_group.addChild( polygon );

	// BranchGraph に SceneGroup を追加
        scene_root.addChild( scene_group );

	// Returns BranchGroup(=SceneGraph)
	return scene_root;
    }
}
 --- ViewTest.java --- to here --- to here --- to here ---