知识大全 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

相关参考