频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

Java3D中平行光投影的实现

作者: 出处:中国IT实验室  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2006-10-20 14:29
关 键 词:Java  3D  平行光
阅读提示:本文给出利用Java3D来实现平行光投影的理论根据和源程序。

理论根据:

假设一个光的方向是(-1,-1,-1) , 投影到XZ平面
一个是直线方程,一个是平面方程,求交
而且平面方程还比较特殊,经过原点,法向量是 0 1 0
简化后就简单了, 假定v是直线的方向

x - vertex.x       y - vertex.y        z-vertex.z
----------------  = --------------- = --------------         直线方程
v.x               v.y                 v.z

平面方程 y = 0

带入就得到了
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 com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;
public class SimpleShadow extends Applet{
//三角平面类
public class TriPlane extends Shape3D{
TriPlane(Point3f A,Point3f B,Point3f C){
this.setGeometry(this.createGeometry3(A,B,C));
this.setAppearance(this.createAppearance());
}
//建立三角平面 
Geometry createGeometry3(Point3f A,Point3f B,Point3f C){
TriangleArray plane=new TriangleArray(3,

GeometryArray.COORDINATES|GeometryArray.NORMALS);
//设置平面3个顶点的坐标
plane.setCoordinate(0,A);
plane.setCoordinate(1,B);
plane.setCoordinate(2,C);  
//计算平面法向量
Vector3f a=new Vector3f(A.x-B.x,A.y-B.y,A.z-B.z);
Vector3f b=new Vector3f(C.x-B.x,C.y-B.y,C.z-B.z);
Vector3f n=new Vector3f();
n.cross(b,a);
//法向量单位化
n.normalize();
//设置平面3个顶点的法向量
plane.setNormal(0,n);
plane.setNormal(1,n);
plane.setNormal(2,n);
return plane;

//创建Material不为空的外观 
Appearance createAppearance(){
Appearance appear=new Appearance();
Material material=new Material();
appear.setMaterial(material);
return appear;

}
//四边平面类
public class QuadPlane extends Shape3D{ 
QuadPlane(Point3f A,Point3f B,Point3f C,Point3f D){
this.setGeometry(this.createGeometry4(A,B,C,D));
this.setAppearance(this.createAppearance());

//创建四边性平面
Geometry createGeometry4(Point3f A,Point3f B,Point3f C,Point3f D){
QuadArray plane=new QuadArray(4,GeometryArray.COORDINATES|GeometryArray.NORMALS);
//设置平面3个顶点的坐标
plane.setCoordinate(0,A);
plane.setCoordinate(1,B);
plane.setCoordinate(2,C);
plane.setCoordinate(3,D);
//计算平面法向量
Vector3f a=new Vector3f(A.x-B.x,A.y-B.y,A.z-B.z);
Vector3f b=new Vector3f(C.x-B.x,C.y-B.y,C.z-B.z);
Vector3f n=new Vector3f();
n.cross(b,a);
//法向量单位化
n.normalize();
//设置平面4个顶点的法向量
plane.setNormal(0,n);
plane.setNormal(1,n);
plane.setNormal(2,n);
plane.setNormal(3,n);
return plane;
}
//创建Material不为空的外观 
Appearance createAppearance(){
Appearance appear=new Appearance();
Material material=new Material();
appear.setMaterial(material);
return appear;
}

//阴影类
public class Shadow3D extends Shape3D{
Shadow3D(GeometryArray geom,Vector3f direction,Color3f col,float height){
int vCount=geom.getVertexCount();
TriangleArray poly=new TriangleArray(vCount,

GeometryArray.COORDINATES|GeometryArray.COLOR_3);
int v;
Point3f vertex=new Point3f();
Point3f shadow=new Point3f();  
for(v=0;v<vCount;v++){
//计算可见面顶点在投影面上的投影坐标
geom.getCoordinate(v,vertex);
System.out.println(vertex.y-height);
shadow.set(vertex.x-(vertex.y-height),height+0.0001f,

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();
Canvas3D c=new Canvas3D(null);
this.add("Center",c);
//创建分支节点
BranchGroup scene=new BranchGroup();
//创建三角形可见平面
Shape3D plane=new TriPlane(new Point3f(0.0f,0.6f,-0.2f),

new Point3f(-0.3f,-0.3f,0.2f),

new Point3f(0.6f,-0.3f,0.2f));
//添加到根分支节点
scene.addChild(plane);
//创建四边形投影平面
Shape3D floor=new QuadPlane(new Point3f(-1.0f,-0.5f,-1.0f),

new Point3f(-1.0f,-0.5f,1.0f),new Point3f(1.0f,-0.5f,1.0f),

new Point3f(1.0f,-0.5f,-1.0f));
//添加到根分支节点
scene.addChild(floor);
//添加到环境光
AmbientLight lightA=new AmbientLight();
lightA.setInfluencingBounds(new BoundingSphere());
scene.addChild(lightA);
//添加平行光
DirectionalLight lightD1=new DirectionalLight();
lightD1.setInfluencingBounds(new BoundingSphere());
Vector3f direction=new Vector3f(-1.0f,-1.0f,-1.0f);
//方向矢量单位化
direction.normalize();
lightD1.setDirection(direction);
scene.addChild(lightD1);
//创建阴影物体
Shape3D shadow=new Shadow3D((GeometryArray)plane.getGeometry(),direction,

new Color3f(0.2f,0.2f,0.2f),-0.5f);
scene.addChild(shadow);
SimpleUniverse u=new SimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
public static void main(String argv[]){
new MainFrame(new SimpleShadow(),256,256);
}
}


发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看52371次)
·UML类图详解 (查看46839次)
·Java编程开发手册 (查看25118次)
·UML统一建模语言 (查看24099次)
·C#技术开发指南 (查看22406次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (304个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (217个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (569个好)
·.NET开发手册 (251个好)
·PB开发教程 (209个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有