java3d设计作品入门级教程 -金沙1005

java3d设计作品入门级教程文章目录前言坐标对应关系加一个面前言鉴于许多同学对计算机图形学设计作品无法下手,特此推出java3d设计作品入门级教程,可以给予毫无头绪的你一点思路。本文仅起到抛砖引玉的作用,并不提供现成的作品。坐标对应关系首先我们要理解java3d中的坐标轴,这个坐标轴与我们平常摆的位置的不太一样,所以要做下区分然后我们把这个坐标轴代入到我们真实的环境中,代码及运行结果如下:packagecom.test.demo01;importjava.applet.applet;importjava.aw


鉴于许多同学对计算机图形学设计作品无法下手,特此推出java3d设计作品入门级教程,可以给予毫无头绪的你一点思路。本文仅起到抛砖引玉的作用,并不提供现成的作品。

首先我们要理解java3d中的坐标轴,这个坐标轴与我们平常摆的位置的不太一样,所以要做下区分

java3d设计作品入门级教程

然后我们把这个坐标轴代入到我们真实的环境中,代码及运行结果如下:

package com.test.demo01;
import java.applet.applet;
import java.awt.*;
import com.sun.j3d.utils.applet.mainframe;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.*;
public class beziersurfacemerging extends applet
{ 
public branchgroup createbranchgroupscenegraph()
{ 
branchgroup branchgrouproot =new branchgroup();
boundingsphere bounds=new boundingsphere(new point3d(0.0,0.0,0.0),100.0);
color3f bgcolor=new color3f(0f,1.0f,1.0f);
background bg=new background(bgcolor);
bg.setapplicationbounds(bounds);
branchgrouproot.addchild(bg);
color3f directionalcolor=new color3f(1.f,0.f,0.f);
vector3f vec=new vector3f(0.f,0.f,-1.0f);
directionallight directionallight=new directionallight(directionalcolor,vec);
directionallight.setinfluencingbounds(bounds);
branchgrouproot.addchild(directionallight);
transform3d tr=new transform3d();
tr.setscale(0.85);
transformgroup transformgroup=new transformgroup(tr);
transformgroup.setcapability(transformgroup.allow_transform_write);
transformgroup.setcapability(transformgroup.allow_transform_read);
branchgrouproot.addchild(transformgroup);
mouserotate mouserotate = new mouserotate();
mouserotate.settransformgroup(transformgroup);
branchgrouproot.addchild(mouserotate);
mouserotate.setschedulingbounds(bounds);
mousezoom mousezoom = new mousezoom();
mousezoom.settransformgroup(transformgroup);
branchgrouproot.addchild(mousezoom);
mousezoom.setschedulingbounds(bounds);
mousetranslate mousetranslate = new mousetranslate();
mousetranslate.settransformgroup(transformgroup);
branchgrouproot.addchild(mousetranslate);
mousetranslate.setschedulingbounds(bounds);
//定义第一个bezier曲面的16个控制顶点
float[][][] p1={ 
{ 
{ 
-0.8f,0.9f,-0.4f,1.f},
{ 
-0.2f,0.8f,-0.5f,1.f},
{ 
0.2f,0.9f,-0.4f,1.f},
{ 
0.8f,0.8f,-0.5f,1.f}  },
{ 
 { 
-0.8f,0.7f,-0.4f,1.f},
{ 
-0.2f,0.6f,0.9f,1.f},
{ 
0.2f,0.7f,0.8f,1.f},
{ 
0.8f,0.6f,-0.4f,1.f} },
{ 
{ 
-0.8f,0.4f,-0.4f,1.f},
{ 
-0.2f,0.5f,0.8f,1.f},
{ 
0.2f,0.3f,0.7f,1.f},
{ 
0.8f,0.4f,-0.5f,1.f}   },
{ 
 { 
-0.8f,0.f,-0.8f,1.f},
{ 
-0.2f,0.1f,0.9f,1.f},
{ 
0.2f,0.f,-0.8f,1.f},
{ 
0.8f,0.1f,0.9f,1.f} } };
//定义第一个bezier曲面外观属性
appearance app1 = new appearance();
polygonattributes polygona1=new polygonattributes();
polygona1.setbackfacenormalflip(true);
polygona1.setcullface(polygonattributes.cull_none);
// polygona1.setpolygonmode(polygonattributes.polygon_line);
app1.setpolygonattributes(polygona1);
coloringattributes color1=new coloringattributes();
color1.setcolor(1.f,0.f,0.f);
app1.setcoloringattributes(color1);
shape3d beziersurfaceface1=new bezierthreeordersurfaceface(p1,app1);
transformgroup.addchild(beziersurfaceface1);
branchgrouproot.compile();
return branchgrouproot;
}
public beziersurfacemerging()
{ 
setlayout(new borderlayout());
graphicsconfiguration gc = simpleuniverse.getpreferredconfiguration();
canvas3d c=new canvas3d(gc);
add("center",c);
branchgroup branchgroupscene=createbranchgroupscenegraph();
simpleuniverse u=new simpleuniverse(c);
u.getviewingplatform().setnominalviewingtransform();
u.addbranchgraph(branchgroupscene);
}
public static void main(string[] args)
{ 
new mainframe(new beziersurfacemerging(),400,400); }
}
class  bezierthreeordersurfaceface extends shape3d
{ 
public bezierthreeordersurfaceface(float[][][] p,appearance app)
{ 
int i,j,k;
int n0;//定义对参数u、v在[0,1]区间的等分点数
float division;//参数u在[0,1]区间的等分线段长度
n0=50;division=1.f/n0;
//分别定义存放控制顶点x、y、z坐标与第四维坐标的数组
float[][] px=new float[4][4];
float[][] py=new float[4][4];
float[][] pz=new float[4][4];
float[][] p4=new float[4][4];
//定义系数矩阵及其转置矩阵
float[][] m1={ 
{ 
1.f,0.f,0.f,0.f},
{ 
-3.f,3.f,0.f,0.f},
{ 
3.f,-6.f,3.f,0.f},
{ 
-1.f,3.f,-3.f,1.f}};
float[][] m2={ 
{ 
1.f,-3.f,3.f,-1.f},
{ 
0.f,3.f,-6.f,3.f},
{ 
0.f,0.f,3.f,-3.f},
{ 
0.f,0.f,0.f,1.f}};
//定义bezier曲面的u、v参数分割点坐标数组
float[][][] uv=new float[n01][n01][2];
//定义u、v矩阵数组
float[][] uu=new float[1][4];
float[][] vv=new float[4][1];
//定义存放曲面上点的坐标的数组
float[][][] surfacexyz=new float[n01][n01][4];
for(i=0;i<n01;i)
for(j=0;j<n01;j)
{ 
 	uv[i][j][0]=i*division;
uv[i][j][1]=j*division;   }
for(i=0;i<4;i)
for(j=0;j<4;j)
{ 
 px[i][j]=p[i][j][0];
py[i][j]=p[i][j][1];
pz[i][j]=p[i][j][2];
p4[i][j]=p[i][j][3]; }
//计算曲面上点的坐标值
for(i=0;i<n01;i)
for(j=0;j<n01;j)
{ 
   uu[0][0]=1.f;
uu[0][1]=uv[i][j][0];
uu[0][2]=uv[i][j][0]*uv[i][j][0];
uu[0][3]=uv[i][j][0]*uv[i][j][0]*uv[i][j][0];
vv[0][0]=1.f;
vv[1][0]=uv[i][j][1];
vv[2][0]=uv[i][j][1]*uv[i][j][1];
vv[3][0]=uv[i][j][1]*uv[i][j][1]*uv[i][j][1];
//计算一点的x坐标
matrixm g0=new matrixm(1,4,4,uu,m1);
matrixm g1=new matrixm(1,4,4,g0.cc,px);
matrixm g2=new matrixm(1,4,4,g1.cc,m2);
matrixm g3=new matrixm(1,4,1,g2.cc,vv);
surfacexyz[i][j][0]=g3.cc[0][0];
//计算一点的y坐标
matrixm g4=new matrixm(1,4,4,uu,m1);
matrixm g5=new matrixm(1,4,4,g4.cc,py);
matrixm g6=new matrixm(1,4,4,g5.cc,m2);
matrixm g7=new matrixm(1,4,1,g6.cc,vv);
surfacexyz[i][j][1]=g7.cc[0][0];
//计算一点的z坐标
matrixm g8=new matrixm(1,4,4,uu,m1);
matrixm g9=new matrixm(1,4,4,g8.cc,pz);
matrixm g10=new matrixm(1,4,4,g9.cc,m2);
matrixm g11=new matrixm(1,4,1,g10.cc,vv);
surfacexyz[i][j][2]=g11.cc[0][0];
//计算一点的第4维坐标
matrixm g12=new matrixm(1,4,4,uu,m1);
matrixm g13=new matrixm(1,4,4,g12.cc,p4);
matrixm g14=new matrixm(1,4,4,g13.cc,m2);
matrixm g15=new matrixm(1,4,1,g14.cc,vv);
surfacexyz[i][j][3]=g15.cc[0][0];
//将齐次坐标转换为三维坐标系坐标,如果第4维为1,则不用除第4维
surfacexyz[i][j][0]=surfacexyz[i][j][0]/surfacexyz[i][j][3];
surfacexyz[i][j][1]=surfacexyz[i][j][1]/surfacexyz[i][j][3];
surfacexyz[i][j][2]=surfacexyz[i][j][2]/surfacexyz[i][j][3];
}
quadarray bezierquadsurfaceface = new quadarray(n0*n0*4,
geometryarray.coordinates|geometryarray.normals);
int c=0;//以顶点数累加的方式设置顶点的序号
for(i=0;i<n0;i)
{ 
for(j=0;j<n0;j)
{ 
//设置一个平面上的4个点
point3f a=new point3f(surfacexyz[i][j][0],surfacexyz[i][j][1],
surfacexyz[i][j][2]);
point3f b=new point3f(surfacexyz[i][j1][0],surfacexyz[i][j1][1],
surfacexyz[i][j1][2]);
point3f c=new point3f(surfacexyz[i1][j1][0],surfacexyz[i1][j1][1],
surfacexyz[i1][j1][2]);
point3f d=new point3f(surfacexyz[i1][j][0],surfacexyz[i1][j][1],
surfacexyz[i1][j][2]);
//计算由四个点形成的平面的法向量
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();
//设置点的序号
bezierquadsurfaceface.setcoordinate(c, a);
bezierquadsurfaceface.setcoordinate(c1, b);
bezierquadsurfaceface.setcoordinate(c2, c);
bezierquadsurfaceface.setcoordinate(c3, d);
//设置点的法向量
bezierquadsurfaceface.setnormal(c, n);
bezierquadsurfaceface.setnormal(c1, n);
bezierquadsurfaceface.setnormal(c2, n);
bezierquadsurfaceface.setnormal(c3, n);
c=c4;
}}
this.addgeometry(bezierquadsurfaceface);
this.setappearance(app);
}}
class  beziersurfacecontrolpoints extends shape3d
{ 
public beziersurfacecontrolpoints(float[][][] p,appearance app)
{ 
int i,j,k;
quadarray beziersurfacecontrolpointsnet =new quadarray(3*3*4,
geometryarray.coordinates|geometryarray.normals);
int c=0;
for(i=0;i<3;i)
{ 
for(j=0;j<3;j)
{ 
point3f a=new point3f(p[i][j][0],p[i][j][1],p[i][j][2]);
point3f b=new point3f(p[i][j1][0],p[i][j1][1],p[i][j1][2]);
point3f c=new point3f(p[i1][j1][0],p[i1][j1][1],p[i1][j1][2]);
point3f d=new point3f(p[i1][j][0],p[i1][j][1],p[i1][j][2]);
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();
beziersurfacecontrolpointsnet.setcoordinate(c, a);
beziersurfacecontrolpointsnet.setcoordinate(c1, b);
beziersurfacecontrolpointsnet.setcoordinate(c2, c);
beziersurfacecontrolpointsnet.setcoordinate(c3, d);
beziersurfacecontrolpointsnet.setnormal(c, n);
beziersurfacecontrolpointsnet.setnormal(c1, n);
beziersurfacecontrolpointsnet.setnormal(c2, n);
beziersurfacecontrolpointsnet.setnormal(c3, n);
c=c4;
}}
this.addgeometry(beziersurfacecontrolpointsnet);
this.setappearance(app);
}}
class matrixm
{ 
public float cc[][]= new float[4][4];
int ll,mm,kk;
public matrixm(int mmm, int kkk, int nnn,float a[][],float b[][])
{ 
for(ll=0;ll<mmm;ll)
for(mm=0;mm<nnn;mm){ 
cc[ll][mm]=0.f;}
for(ll=0;ll<mmm;ll)
for(mm=0;mm<nnn;mm)
{ 
for(kk=0;kk<kkk;kk) cc[ll][mm]=cc[ll][mm]a[ll][kk]*b[kk][mm];}
}}
java3d设计作品入门级教程

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活clion
datagrip dataspell
dotcover dotmemory
dottrace goland
phpstorm pycharm
resharper reshac
rider rubymine
webstorm 全家桶
java3d设计作品入门级教程

在这一长段代码中,只有p1的这16个点是我们要改动的地方,这16个的点共同组成了一个曲面。每个点包含了4个坐标,但其中的1.f我们是不需要去动的,因此真正有用的是前三个
{x, y, z, 1.f}
这里的xyz就分别对应到上述提到的坐标轴中,那么理解了坐标是怎么使用后,还要将坐标对应到曲面中。

为了方便演示,我们将p1中的坐标改成如下:

float[][][] p1={ 

{ 
{ 
-0.8f, -1.2f, -0.8f, 1.f}, { 
-0.2f, 0.2f, -0.5f, 1.f},
{ 
0.2f, 0.3f, -0.5f, 1.f}, { 
0.8f, -1.2f, -0.8f, 1.f}},
{ 
{ 
-0.8f, -0.1f, -0.2f, 1.f}, { 
-0.2f, 0.9f, -0.2f, 1.f},
{ 
0.2f, 0.9f, -0.2f, 1.f}, { 
0.8f, -0.1f, -0.2f, 1.f}},
{ 
{ 
-0.8f, -0.1f, 0.2f, 1.f}, { 
-0.2f, 0.9f, 0.2f, 1.f},
{ 
0.2f, 0.9f, 0.2f, 1.f}, { 
0.8f, -0.1f, 0.2f, 1.f}},
{ 
{ 
-0.6f, -0.6f, 0.9f, 1.f}, { 
-0.2f, 0.2f, 0.5f, 1.f},
{ 
0.2f, 0.3f, 0.5f, 1.f}, { 
0.6f, -0.65f, 0.8f, 1.f}}};

运行我们的代码,得到如下结果:

java3d设计作品入门级教程

到这步后,我们要把最前面提到的坐标轴,与这张图相结合。这里注意一下,为了避免把自己搞混乱,运行出结果后就不要随便去转动它!!!第一印象很重要。

java3d设计作品入门级教程

这就是在这张图中代表的坐标系(上下位置不一定准确)
我们的重头戏要来了,这16个点分别代表图中的哪个位置,因为这个图像凹凸有致,我们很容易想到去调整它的y坐标,来得到最佳的观察效果。
我们将这里的坐标分别4组,从上至下,从左至右,依次记为1,2,3……16

java3d设计作品入门级教程

首先我们将第一个点的y坐标改为0,观察效果

java3d设计作品入门级教程

可以看到已经有了一定的变化,随后我们转动图像,以俯视的视角,也就是想象自己飞到了图像的上方。

java3d设计作品入门级教程

可以看到图形的这一角比较特别,相比较原先有点翘起,归根结底就是我们把第一个点的纵坐标由-1.2f变为了0f,产生了这个效果。有兴趣的同学可以再把它改成-1.2f,就会得到如下 结果:

java3d设计作品入门级教程

我们依葫芦画瓢,把这16个点都改一遍,也就是只把它们的y坐标改为0,分别会得到以下结果(均采用了俯视的视角):

java3d设计作品入门级教程
java3d设计作品入门级教程
java3d设计作品入门级教程

到这里,我们第一组的坐标全部测试完毕了,相信大家一定对坐标和曲面之间的对应关系有了一定的了解。现在我们再测一下每组的第一个点,同样修改其y坐标

java3d设计作品入门级教程
java3d设计作品入门级教程
java3d设计作品入门级教程

自己都试一遍印象才能深刻噢!

接着我们看看把全部的y坐标归0的结果

java3d设计作品入门级教程

可以看到打开的时候已经变成了一个平面了,不再是曲面,这也给了 我们一个构造平面的思路,也就是把16个点的xyz任意一个全部设置为0,就可以得到平面。

当然学到这里,你已经掌握了一个曲面是如何运转的,然而我们的作品肯定不是只由一个曲面就能完成,除非你看开了。

接下来我们将详细分析一下,自己如何再加一个曲面,然后在此基础上,你可以添加任意n个面

添加如下代码, 这里的p2是由p1的y坐标修改为0.5f得来,也就是把整个面往上抬了0.5f的距离,可以先在脑海中想想会是什么样子再往下滑,建立空间感

float[][][] p2={ 

{ 
{ 
-0.8f, 0.5f, -0.8f, 1.f}, { 
-0.2f, 0.5f, -0.5f, 1.f},
{ 
0.2f, 0.5f, -0.5f, 1.f}, { 
0.8f, 0.5f, -0.8f, 1.f}},
{ 
{ 
-0.8f, 0.5f, -0.2f, 1.f}, { 
-0.2f, 0.5f, -0.2f, 1.f},
{ 
0.2f, 0.5f, -0.2f, 1.f}, { 
0.8f, 0.5f, -0.2f, 1.f}},
{ 
{ 
-0.8f, 0.5f, 0.2f, 1.f}, { 
-0.2f, 0.5f, 0.2f, 1.f},
{ 
0.2f, 0.5f, 0.2f, 1.f}, { 
0.8f, 0.5f, 0.2f, 1.f}},
{ 
{ 
-0.6f, 0.5f, 0.9f, 1.f}, { 
-0.2f, 0.5f, 0.5f, 1.f},
{ 
0.2f, 0.5f, 0.5f, 1.f}, { 
0.6f, 0.5f, 0.8f, 1.f}}};
//定义第一个bezier曲面外观属性
appearance app2 = new appearance();
polygonattributes polygona2=new polygonattributes();
polygona2.setbackfacenormalflip(true);
polygona2.setcullface(polygonattributes.cull_none);
polygona2.setpolygonmode(polygonattributes.polygon_line);
app2.setpolygonattributes(polygona2);
coloringattributes color2=new coloringattributes();
color2.setcolor(0.8f,0.f,0.f);
app2.setcoloringattributes(color2);
shape3d beziersurfaceface2=new bezierthreeordersurfaceface(p2,app2);
transformgroup.addchild(beziersurfaceface2);

说说要改的地方,p2 app2 polygona2 color2 beziersurfaceface2
这里都由原先的1改为了2,要是想添加3个,4个,10个,100个,也是以此类推。
效果如下:

java3d设计作品入门级教程

看到这里,相信你一定已经会意了
小练习:可以先动手试试如何用6个曲面拼成一个方块
本次教程就到这里了,快去完成自己的设计作品吧!
4班冲!

package com.test.demo01;
import java.applet.applet;
import java.awt.*;
import com.sun.j3d.utils.applet.mainframe;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.*;
public class beziersurfacemerging extends applet
{ 
public branchgroup createbranchgroupscenegraph()
{ 
branchgroup branchgrouproot =new branchgroup();
boundingsphere bounds=new boundingsphere(new point3d(0.0,0.0,0.0),100.0);
color3f bgcolor=new color3f(0f,1.0f,1.0f);
background bg=new background(bgcolor);
bg.setapplicationbounds(bounds);
branchgrouproot.addchild(bg);
color3f directionalcolor=new color3f(1.f,0.f,0.f);
vector3f vec=new vector3f(0.f,0.f,-1.0f);
directionallight directionallight=new directionallight(directionalcolor,vec);
directionallight.setinfluencingbounds(bounds);
branchgrouproot.addchild(directionallight);
transform3d tr=new transform3d();
tr.setscale(0.85);
transformgroup transformgroup=new transformgroup(tr);
transformgroup.setcapability(transformgroup.allow_transform_write);
transformgroup.setcapability(transformgroup.allow_transform_read);
branchgrouproot.addchild(transformgroup);
mouserotate mouserotate = new mouserotate();
mouserotate.settransformgroup(transformgroup);
branchgrouproot.addchild(mouserotate);
mouserotate.setschedulingbounds(bounds);
mousezoom mousezoom = new mousezoom();
mousezoom.settransformgroup(transformgroup);
branchgrouproot.addchild(mousezoom);
mousezoom.setschedulingbounds(bounds);
mousetranslate mousetranslate = new mousetranslate();
mousetranslate.settransformgroup(transformgroup);
branchgrouproot.addchild(mousetranslate);
mousetranslate.setschedulingbounds(bounds);
//定义第一个bezier曲面的16个控制顶点
float[][][] p1={ 

{ 
{ 
-0.8f, 0f, -0.8f, 1.f}, { 
-0.2f, 0f, -0.5f, 1.f},
{ 
0.2f, 0f, -0.5f, 1.f}, { 
0.8f, 0f, -0.8f, 1.f}},
{ 
{ 
-0.8f, 0f, -0.2f, 1.f}, { 
-0.2f, 0f, -0.2f, 1.f},
{ 
0.2f, 0f, -0.2f, 1.f}, { 
0.8f, 0f, -0.2f, 1.f}},
{ 
{ 
-0.8f, 0f, 0.2f, 1.f}, { 
-0.2f, 0f, 0.2f, 1.f},
{ 
0.2f, 0f, 0.2f, 1.f}, { 
0.8f, 0f, 0.2f, 1.f}},
{ 
{ 
-0.6f, 0f, 0.9f, 1.f}, { 
-0.2f, 0f, 0.5f, 1.f},
{ 
0.2f, 0f, 0.5f, 1.f}, { 
0.6f, 0f, 0.8f, 1.f}}};
//定义第一个bezier曲面外观属性
appearance app1 = new appearance();
polygonattributes polygona1=new polygonattributes();
polygona1.setbackfacenormalflip(true);
polygona1.setcullface(polygonattributes.cull_none);
polygona1.setpolygonmode(polygonattributes.polygon_line);
app1.setpolygonattributes(polygona1);
coloringattributes color1=new coloringattributes();
color1.setcolor(0.8f,0.f,0.f);
app1.setcoloringattributes(color1);
float[][][] p2={ 

{ 
{ 
-0.8f, 0.5f, -0.8f, 1.f}, { 
-0.2f, 0.5f, -0.5f, 1.f},
{ 
0.2f, 0.5f, -0.5f, 1.f}, { 
0.8f, 0.5f, -0.8f, 1.f}},
{ 
{ 
-0.8f, 0.5f, -0.2f, 1.f}, { 
-0.2f, 0.5f, -0.2f, 1.f},
{ 
0.2f, 0.5f, -0.2f, 1.f}, { 
0.8f, 0.5f, -0.2f, 1.f}},
{ 
{ 
-0.8f, 0.5f, 0.2f, 1.f}, { 
-0.2f, 0.5f, 0.2f, 1.f},
{ 
0.2f, 0.5f, 0.2f, 1.f}, { 
0.8f, 0.5f, 0.2f, 1.f}},
{ 
{ 
-0.6f, 0.5f, 0.9f, 1.f}, { 
-0.2f, 0.5f, 0.5f, 1.f},
{ 
0.2f, 0.5f, 0.5f, 1.f}, { 
0.6f, 0.5f, 0.8f, 1.f}}};
//定义第一个bezier曲面外观属性
appearance app2 = new appearance();
polygonattributes polygona2=new polygonattributes();
polygona2.setbackfacenormalflip(true);
polygona2.setcullface(polygonattributes.cull_none);
polygona2.setpolygonmode(polygonattributes.polygon_line);
app2.setpolygonattributes(polygona2);
coloringattributes color2=new coloringattributes();
color2.setcolor(0.8f,0.f,0.f);
app2.setcoloringattributes(color2);
shape3d beziersurfaceface2=new bezierthreeordersurfaceface(p2,app2);
transformgroup.addchild(beziersurfaceface2);
shape3d beziersurfaceface1=new bezierthreeordersurfaceface(p1,app1);
transformgroup.addchild(beziersurfaceface1);
branchgrouproot.compile();
return branchgrouproot;
}
public beziersurfacemerging()
{ 
setlayout(new borderlayout());
graphicsconfiguration gc = simpleuniverse.getpreferredconfiguration();
canvas3d c=new canvas3d(gc);
add("center",c);
branchgroup branchgroupscene=createbranchgroupscenegraph();
simpleuniverse u=new simpleuniverse(c);
u.getviewingplatform().setnominalviewingtransform();
u.addbranchgraph(branchgroupscene);
}
public static void main(string[] args)
{ 
new mainframe(new beziersurfacemerging(),400,400); }
}
class  bezierthreeordersurfaceface extends shape3d
{ 
public bezierthreeordersurfaceface(float[][][] p,appearance app)
{ 
int i,j,k;
int n0;//定义对参数u、v在[0,1]区间的等分点数
float division;//参数u在[0,1]区间的等分线段长度
n0=50;division=1.f/n0;
//分别定义存放控制顶点x、y、z坐标与第四维坐标的数组
float[][] px=new float[4][4];
float[][] py=new float[4][4];
float[][] pz=new float[4][4];
float[][] p4=new float[4][4];
//定义系数矩阵及其转置矩阵
float[][] m1={ 
{ 
1.f,0.f,0.f,0.f},
{ 
-3.f,3.f,0.f,0.f},
{ 
3.f,-6.f,3.f,0.f},
{ 
-1.f,3.f,-3.f,1.f}};
float[][] m2={ 
{ 
1.f,-3.f,3.f,-1.f},
{ 
0.f,3.f,-6.f,3.f},
{ 
0.f,0.f,3.f,-3.f},
{ 
0.f,0.f,0.f,1.f}};
//定义bezier曲面的u、v参数分割点坐标数组
float[][][] uv=new float[n01][n01][2];
//定义u、v矩阵数组
float[][] uu=new float[1][4];
float[][] vv=new float[4][1];
//定义存放曲面上点的坐标的数组
float[][][] surfacexyz=new float[n01][n01][4];
for(i=0;i<n01;i)
for(j=0;j<n01;j)
{ 
 	uv[i][j][0]=i*division;
uv[i][j][1]=j*division;   }
for(i=0;i<4;i)
for(j=0;j<4;j)
{ 
 px[i][j]=p[i][j][0];
py[i][j]=p[i][j][1];
pz[i][j]=p[i][j][2];
p4[i][j]=p[i][j][3]; }
//计算曲面上点的坐标值
for(i=0;i<n01;i)
for(j=0;j<n01;j)
{ 
   uu[0][0]=1.f;
uu[0][1]=uv[i][j][0];
uu[0][2]=uv[i][j][0]*uv[i][j][0];
uu[0][3]=uv[i][j][0]*uv[i][j][0]*uv[i][j][0];
vv[0][0]=1.f;
vv[1][0]=uv[i][j][1];
vv[2][0]=uv[i][j][1]*uv[i][j][1];
vv[3][0]=uv[i][j][1]*uv[i][j][1]*uv[i][j][1];
//计算一点的x坐标
matrixm g0=new matrixm(1,4,4,uu,m1);
matrixm g1=new matrixm(1,4,4,g0.cc,px);
matrixm g2=new matrixm(1,4,4,g1.cc,m2);
matrixm g3=new matrixm(1,4,1,g2.cc,vv);
surfacexyz[i][j][0]=g3.cc[0][0];
//计算一点的y坐标
matrixm g4=new matrixm(1,4,4,uu,m1);
matrixm g5=new matrixm(1,4,4,g4.cc,py);
matrixm g6=new matrixm(1,4,4,g5.cc,m2);
matrixm g7=new matrixm(1,4,1,g6.cc,vv);
surfacexyz[i][j][1]=g7.cc[0][0];
//计算一点的z坐标
matrixm g8=new matrixm(1,4,4,uu,m1);
matrixm g9=new matrixm(1,4,4,g8.cc,pz);
matrixm g10=new matrixm(1,4,4,g9.cc,m2);
matrixm g11=new matrixm(1,4,1,g10.cc,vv);
surfacexyz[i][j][2]=g11.cc[0][0];
//计算一点的第4维坐标
matrixm g12=new matrixm(1,4,4,uu,m1);
matrixm g13=new matrixm(1,4,4,g12.cc,p4);
matrixm g14=new matrixm(1,4,4,g13.cc,m2);
matrixm g15=new matrixm(1,4,1,g14.cc,vv);
surfacexyz[i][j][3]=g15.cc[0][0];
//将齐次坐标转换为三维坐标系坐标,如果第4维为1,则不用除第4维
surfacexyz[i][j][0]=surfacexyz[i][j][0]/surfacexyz[i][j][3];
surfacexyz[i][j][1]=surfacexyz[i][j][1]/surfacexyz[i][j][3];
surfacexyz[i][j][2]=surfacexyz[i][j][2]/surfacexyz[i][j][3];
}
quadarray bezierquadsurfaceface = new quadarray(n0*n0*4,
geometryarray.coordinates|geometryarray.normals);
int c=0;//以顶点数累加的方式设置顶点的序号
for(i=0;i<n0;i)
{ 
for(j=0;j<n0;j)
{ 
//设置一个平面上的4个点
point3f a=new point3f(surfacexyz[i][j][0],surfacexyz[i][j][1],
surfacexyz[i][j][2]);
point3f b=new point3f(surfacexyz[i][j1][0],surfacexyz[i][j1][1],
surfacexyz[i][j1][2]);
point3f c=new point3f(surfacexyz[i1][j1][0],surfacexyz[i1][j1][1],
surfacexyz[i1][j1][2]);
point3f d=new point3f(surfacexyz[i1][j][0],surfacexyz[i1][j][1],
surfacexyz[i1][j][2]);
//计算由四个点形成的平面的法向量
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();
//设置点的序号
bezierquadsurfaceface.setcoordinate(c, a);
bezierquadsurfaceface.setcoordinate(c1, b);
bezierquadsurfaceface.setcoordinate(c2, c);
bezierquadsurfaceface.setcoordinate(c3, d);
//设置点的法向量
bezierquadsurfaceface.setnormal(c, n);
bezierquadsurfaceface.setnormal(c1, n);
bezierquadsurfaceface.setnormal(c2, n);
bezierquadsurfaceface.setnormal(c3, n);
c=c4;
}}
this.addgeometry(bezierquadsurfaceface);
this.setappearance(app);
}}
class  beziersurfacecontrolpoints extends shape3d
{ 
public beziersurfacecontrolpoints(float[][][] p,appearance app)
{ 
int i,j,k;
quadarray beziersurfacecontrolpointsnet =new quadarray(3*3*4,
geometryarray.coordinates|geometryarray.normals);
int c=0;
for(i=0;i<3;i)
{ 
for(j=0;j<3;j)
{ 
point3f a=new point3f(p[i][j][0],p[i][j][1],p[i][j][2]);
point3f b=new point3f(p[i][j1][0],p[i][j1][1],p[i][j1][2]);
point3f c=new point3f(p[i1][j1][0],p[i1][j1][1],p[i1][j1][2]);
point3f d=new point3f(p[i1][j][0],p[i1][j][1],p[i1][j][2]);
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();
beziersurfacecontrolpointsnet.setcoordinate(c, a);
beziersurfacecontrolpointsnet.setcoordinate(c1, b);
beziersurfacecontrolpointsnet.setcoordinate(c2, c);
beziersurfacecontrolpointsnet.setcoordinate(c3, d);
beziersurfacecontrolpointsnet.setnormal(c, n);
beziersurfacecontrolpointsnet.setnormal(c1, n);
beziersurfacecontrolpointsnet.setnormal(c2, n);
beziersurfacecontrolpointsnet.setnormal(c3, n);
c=c4;
}}
this.addgeometry(beziersurfacecontrolpointsnet);
this.setappearance(app);
}}
class matrixm
{ 
public float cc[][]= new float[4][4];
int ll,mm,kk;
public matrixm(int mmm, int kkk, int nnn,float a[][],float b[][])
{ 
for(ll=0;ll<mmm;ll)
for(mm=0;mm<nnn;mm){ 
cc[ll][mm]=0.f;}
for(ll=0;ll<mmm;ll)
for(mm=0;mm<nnn;mm)
{ 
for(kk=0;kk<kkk;kk) cc[ll][mm]=cc[ll][mm]a[ll][kk]*b[kk][mm];}
}}
js555888金沙老品牌的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/141794.html

(0)

相关推荐

  • java环境变量java_home、classpath、path设置详解[通俗易懂]windows下java用到的环境变量主要有3个,java_home、classpath、path。java_home指向的是jdk的安装路径,如c:\programfiles\java\jdk1.8.0_131(这里填写你的java安装目录),在这路径下你应该能够找到bin、lib等目录。(今晚使用新系统配置,不知道怎么的需要加bin才可以在cmd运行,java……

    2022年12月19日
  • java异常处理_java
    jvm默认的异常处理方式 开发中的异常处理方式 jvm默认的异常处理方式 定义:在控制台打印错误信息,并终止程序。 开发中的异常处理方式(两种) try…catch(finally):捕获,自己处理 throws:抛出,交给调用者 示例: 1.jvm默认的异常处理方式 public static …

  • java和javascript有关系吗_javacomparatorjava和javascript有啥区别,据说还有很多人不知道,来给大家科普一下两者区别!java和javascript不同之处:1.用处不一样:它们最本质的不同就是用途:java目前被广泛应用于pc端、手机端、互联网、数据中心等等;而javascript则被主要用于嵌入文本到html页面,读写html元素,控制cookies等。2.出身不同:javascript与…

    2022年12月25日
  • java数据类型转换规则_java动态改变数据类型public class demo04 { public static void main(string[] args) { //低 >高 //byte、short、char->int->long->float->double int i = 128; //强制转换,(类型)变量名 高–>低 by …

  • java web实现video播放[通俗易懂]javaweb实现video播放1.前端的实现通过getqueryvariable获取url的参数(vid)functiongetqueryvariable(variable){varquery=window.location.search.substring(1);varvars=query.split(“&”);for(v…

    2022年12月10日
  • java开发中经常使用到的几种webservice技术实现方案「建议收藏」java开发中经常使用到的几种webservice技术实现方案   随着异构系统互联需求的不断增加,webservice的重要性也日益彰显出来。凭借webservice,我们可以实现基于不同程序语言的项目的互联互通。更可以将开发好的程序接口以服务的形式发布出去供使用者调用。webservice也是soa的基石,因此目前各大企业对于webservice开发者的需求量也是与日俱增。   w…

    2022年12月13日
  • 使用原生javascript实现ajax提交form表单使用原生javascript实现ajax提交form表单============================1准备表单    首先我们需要编写一个html代码,这里我是采用nodejs里面的jade模板引擎来进行生成html代码的。form(action=&quot;/ajaxtest2&quot;,method=&quot;post&quot;,enctype=&quot;text/plain&

  • java进度条实现_读取大文件的文件进度条java进度条简介利用jprogressbar类可以实现一个进度条。它一般是一种颜色部分或完全填充的矩形。缺省情况下,进度条配备了一个凹陷的边框,并水平放置。进度条还可以选择显示一个字符串,这个字符串在进度条矩形的中央位置上显示。这个字符串缺省时为耗时任务已完成的百分比。这个字符串可用jprogressbar.setstring方法定制。进度条是一个矩形组件,通过填充它的部分或全部来指示一个任务…

发表回复

您的电子邮箱地址不会被公开。

联系金沙1005

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图