[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 ---