知识大全 java3D中平行光投影的实现
Posted 知
篇首语:最是人间留不住,朱颜辞镜花辞树。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java3D中平行光投影的实现相关的知识,希望对你有一定的参考价值。
java3D中平行光投影的实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
理论根据:假设一个光的方向是( ) 投影到XZ平面
一个是直线方程 一个是平面方程 求交而且平面方程还比较特殊 经过原点 法向量是 简化后就简单了 假定v是直线的方向
x vertex x y vertex y z vertex z = = 直线方程 v x v y v z
平面方程 y =
带入就得到了x = vertex x + v x / v y * ( vertex y)z = vertex z + v x / v z * ( vertex z)
源程序:import java applet Applet;import java awt BorderLayout;import java awt GraphicsConfiguration;import java awt Label;import sun j d utils applet MainFrame;import sun j d utils universe *;import sun j d utils geometry *;import dia j d *;import javax vecmath *;public class SimpleShadow extends Applet //三角平面类 public class TriPlane extends Shape D TriPlane(Point f A Point f B Point f C) this setGeometry(this createGeometry (A B C)); this setAppearance(this createAppearance()); //建立三角平面 Geometry createGeometry (Point f A Point f B Point f C) TriangleArray plane=new TriangleArray( GeometryArray COORDINATES|GeometryArray NORMALS); //设置平面 个顶点的坐标 plane setCoordinate( A); plane setCoordinate( B); plane setCoordinate( C); //计算平面法向量 Vector f a=new Vector f(A x B x A y B y A z B z); Vector f b=new Vector f(C x B x C y B y C z B z); Vector f n=new Vector f(); n cross(b a); //法向量单位化 n normalize(); //设置平面 个顶点的法向量 plane setNormal( n); plane setNormal( n); plane setNormal( n); return plane; //创建Material不为空的外观 Appearance createAppearance() Appearance appear=new Appearance(); Material material=new Material(); appear setMaterial(material); return appear; //四边平面类 public class QuadPlane extends Shape D QuadPlane(Point f A Point f B Point f C Point f D) this setGeometry(this createGeometry (A B C D)); this setAppearance(this createAppearance()); //创建四边性平面 Geometry createGeometry (Point f A Point f B Point f C Point f D) QuadArray plane=new QuadArray( GeometryArray COORDINATES|GeometryArray NORMALS); //设置平面 个顶点的坐标 plane setCoordinate( A); plane setCoordinate( B); plane setCoordinate( C); plane setCoordinate( D); //计算平面法向量 Vector f a=new Vector f(A x B x A y B y A z B z); Vector f b=new Vector f(C x B x C y B y C z B z); Vector f n=new Vector f(); n cross(b a); //法向量单位化 n normalize(); //设置平面 个顶点的法向量 plane setNormal( n); plane setNormal( n); plane setNormal( n); plane setNormal( n); return plane;
//创建Material不为空的外观 Appearance createAppearance() Appearance appear=new Appearance(); Material material=new Material(); appear setMaterial(material); return appear; //阴影类 public class Shadow D extends Shape D Shadow D(GeometryArray geom Vector f direction Color f col float height) int vCount=geom getVertexCount(); TriangleArray poly=new TriangleArray(vCount GeometryArray COORDINATES|GeometryArray COLOR_ ); int v; Point f vertex=new Point f(); Point f shadow=new Point f(); for(v= ;v<vCount;v++) //计算可见面顶点在投影面上的投影坐标 geom getCoordinate(v vertex); System out println(vertex y height); shadow set(vertex x (vertex y height) height+ f vertex z (vertex y height)); poly setCoordinate(v shadow); poly setColor(v col);
this setGeometry(poly); public SimpleShadow() this setLayout(new BorderLayout()); //GraphicsConfiguration config =SimpleUniverse getPreferredConfiguration(); Canvas D c=new Canvas D(null); this add( Center c); //创建分支节点 BranchGroup scene=new BranchGroup(); //创建三角形可见平面 Shape D plane=new TriPlane(new Point f( f f f) new Point f( f f f) new Point f( f f f)); //添加到根分支节点 scene addChild(plane); //创建四边形投影平面 Shape D floor=new QuadPlane(new Point f( f f f) new Point f( f f f) new Point f( f f f) new Point f( f f f)); //添加到根分支节点 scene addChild(floor); //添加到环境光 AmbientLight lightA=new AmbientLight(); lightA setInfluencingBounds(new BoundingSphere()); scene addChild(lightA); //添加平行光 DirectionalLight lightD =new DirectionalLight(); lightD setInfluencingBounds(new BoundingSphere()); Vector f direction=new Vector f( f f f); //方向矢量单位化 direction normalize(); lightD setDirection(direction); scene addChild(lightD ); //创建阴影物体 Shape D shadow=new Shadow D((GeometryArray)plane getGeometry() direction new Color f( f f f) f); scene addChild(shadow); SimpleUniverse u=new SimpleUniverse(c); u getViewingPlatform() setNominalViewingTransform(); u addBranchGraph(scene); public static void main(String argv[]) new MainFrame(new SimpleShadow() );
cha138/Article/program/Java/hx/201311/26962相关参考