仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 699|回复: 11
打印 上一主题 下一主题

[学习教程] 发布一篇Java3D中平行光投影的完成

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:12:18 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包......
实际依据:
假定一个光的偏向是(-1,-1,-1),投影到XZ立体
一个是直线方程,一个是立体方程,求交
并且立体方程还对照特别,经由原点,法向量是010
简化后就复杂了,假定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)
源程序:
importjava.applet.Applet;
importjava.awt.BorderLayout;
importjava.awt.GraphicsConfiguration;
importjava.awt.Label;
importcom.sun.j3d.utils.applet.MainFrame;
importcom.sun.j3d.utils.universe.*;
importcom.sun.j3d.utils.geometry.*;
importjavax.media.j3d.*;
importjavax.vecmath.*;
publicclassSimpleShadowextendsApplet{
//三角立体类
publicclassTriPlaneextendsShape3D{
TriPlane(Point3fA,Point3fB,Point3fC){
this.setGeometry(this.createGeometry3(A,B,C));
this.setAppearance(this.createAppearance());
}
//创建三角立体
GeometrycreateGeometry3(Point3fA,Point3fB,Point3fC){
TriangleArrayplane=newTriangleArray(3,
GeometryArray.COORDINATES|GeometryArray.NORMALS);
//设置立体3个极点的坐标
plane.setCoordinate(0,A);
plane.setCoordinate(1,B);
plane.setCoordinate(2,C); 
//盘算立体法向量
Vector3fa=newVector3f(A.x-B.x,A.y-B.y,A.z-B.z);
Vector3fb=newVector3f(C.x-B.x,C.y-B.y,C.z-B.z);
Vector3fn=newVector3f();
n.cross(b,a);
//法向量单元化
n.normalize();
//设置立体3个极点的法向量
plane.setNormal(0,n);
plane.setNormal(1,n);
plane.setNormal(2,n);
returnplane;
}
//创立Material不为空的表面 
AppearancecreateAppearance(){
Appearanceappear=newAppearance();
Materialmaterial=newMaterial();
appear.setMaterial(material);
returnappear;
}
}
//四边立体类
publicclassQuadPlaneextendsShape3D{ 
QuadPlane(Point3fA,Point3fB,Point3fC,Point3fD){
this.setGeometry(this.createGeometry4(A,B,C,D));
this.setAppearance(this.createAppearance());
} 
//创立四边性立体
GeometrycreateGeometry4(Point3fA,Point3fB,Point3fC,Point3fD){
QuadArrayplane=newQuadArray(4,GeometryArray.COORDINATES|GeometryArray.NORMALS);
//设置立体3个极点的坐标
plane.setCoordinate(0,A);
plane.setCoordinate(1,B);
plane.setCoordinate(2,C);
plane.setCoordinate(3,D);
//盘算立体法向量
Vector3fa=newVector3f(A.x-B.x,A.y-B.y,A.z-B.z);
Vector3fb=newVector3f(C.x-B.x,C.y-B.y,C.z-B.z);
Vector3fn=newVector3f();
n.cross(b,a);
//法向量单元化
n.normalize();
//设置立体4个极点的法向量
plane.setNormal(0,n);
plane.setNormal(1,n);
plane.setNormal(2,n);
plane.setNormal(3,n);
returnplane;
}
//创立Material不为空的表面 
AppearancecreateAppearance(){
Appearanceappear=newAppearance();
Materialmaterial=newMaterial();
appear.setMaterial(material);
returnappear;
}
}
//暗影类
publicclassShadow3DextendsShape3D{
Shadow3D(GeometryArraygeom,Vector3fdirection,Color3fcol,floatheight){
intvCount=geom.getVertexCount();
TriangleArraypoly=newTriangleArray(vCount,
GeometryArray.COORDINATES|GeometryArray.COLOR_3);
intv;
Point3fvertex=newPoint3f();
Point3fshadow=newPoint3f(); 
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);
}
}
publicSimpleShadow(){
this.setLayout(newBorderLayout());
//GraphicsConfigurationconfig=SimpleUniverse.getPreferredConfiguration();
Canvas3Dc=newCanvas3D(null);
this.add("Center",c);
//创立分支节点
BranchGroupscene=newBranchGroup();
//创立三角形可见立体
Shape3Dplane=newTriPlane(newPoint3f(0.0f,0.6f,-0.2f),
newPoint3f(-0.3f,-0.3f,0.2f),
newPoint3f(0.6f,-0.3f,0.2f));
//增加到根分支节点
scene.addChild(plane);
//创立四边形投影立体
Shape3Dfloor=newQuadPlane(newPoint3f(-1.0f,-0.5f,-1.0f),
newPoint3f(-1.0f,-0.5f,1.0f),newPoint3f(1.0f,-0.5f,1.0f),
newPoint3f(1.0f,-0.5f,-1.0f));
//增加到根分支节点
scene.addChild(floor);
//增加到情况光
AmbientLightlightA=newAmbientLight();
lightA.setInfluencingBounds(newBoundingSphere());
scene.addChild(lightA);
//增加平行光
DirectionalLightlightD1=newDirectionalLight();
lightD1.setInfluencingBounds(newBoundingSphere());
Vector3fdirection=newVector3f(-1.0f,-1.0f,-1.0f);
//偏向矢量单元化
direction.normalize();
lightD1.setDirection(direction);
scene.addChild(lightD1);
//创立暗影物体
Shape3Dshadow=newShadow3D((GeometryArray)plane.getGeometry(),direction,
newColor3f(0.2f,0.2f,0.2f),-0.5f);
scene.addChild(shadow);
SimpleUniverseu=newSimpleUniverse(c);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
publicstaticvoidmain(Stringargv[]){
newMainFrame(newSimpleShadow(),256,256);
}
}

还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。
精灵巫婆 该用户已被删除
11#
发表于 2015-3-20 14:44:11 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
变相怪杰 该用户已被删除
10#
发表于 2015-3-13 06:10:29 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-9 21:48:50 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
老尸 该用户已被删除
8#
发表于 2015-3-6 15:09:06 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
兰色精灵 该用户已被删除
7#
发表于 2015-2-28 06:48:21 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
莫相离 该用户已被删除
6#
发表于 2015-2-11 20:52:41 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
活着的死人 该用户已被删除
5#
发表于 2015-2-11 16:12:03 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
因胸联盟 该用户已被删除
地板
发表于 2015-2-5 11:53:34 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-28 05:47:17 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
沙发
发表于 2015-1-28 05:45:06 | 只看该作者
是一种为 Internet发展的计算机语言
乐观 该用户已被删除
楼主
发表于 2015-1-22 09:30:20 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 04:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表