你自己的3D建模软件(基础01)——初探ProScene
首先让我们先制作一个最简单的也是一步实现我们目的的——基于ProScene的3D交互浏览器,不仅能控制摄像机角度,还可点选并用鼠标控制具体3D对象的空间变换(旋转,平移等) 。
根据准备篇的内容,我们import ProScene和ControlP5两个库,并新建一个Tab,命名为Box。
在Box里,我们编写一个名为Box的类,其有一个参数和一个方法:用于存储空间变换信息的对象iFrame和用于绘制图像的draw():
1 class Box { 2 InteractiveFrame iFrame; 3 4 Box(Scene scene,float x,float y,float z) { 5 iFrame=new InteractiveFrame(scene); 6 iFrame.setPosition(x,y,z); 7 } 8 9 void draw() { 10 pushMatrix(); 11 iFrame.applyTransformation(); 12 pushStyle(); 13 if (iFrame.grabsMouse()) 14 fill(255, 0, 0); 15 else 16 fill(0, 0, 255); 17 box(20); 18 popStyle(); 19 popMatrix(); 20 } 21 }
InteractiveFrame类是用于负责单个对象的的鼠标交互:点选与空间变换。我们只需在每个3D类中构造一个该对象,其即可自动生成对应的鼠标事件,并可完全负责该对象的空间变换。需要注意的是:
该类的构造器依赖于一个Scene类的对象;
iFrame.applyTransformation()负责在显示时的具体变换指令,必须在绘制函数box(float)前调用,并用pushMatrix()和popMatrix()包裹;
iFrame.grabsMouse()返回一个布尔变量,确定该Box是否被选择,如果是则填充红色,反之蓝色,而pushStyle()与popStyle()的功能类似上面的一对,但是所针对的是填充fill()和stroke()等绘制样式。
关于这个类的更多细节,会在后文做详细说明。
下面我们回到主Tab里,编写程序的核心代码:
1 import remixlab.proscene.*; 2 import controlP5.*; 3 4 Scene scene; //ProScene核心类 5 ArrayList<Box> boxes; //承载3D对象的容器 6 ControlP5 cp5; //ControlP5的核心类 7 8 void setup() { 9 size(640, 360, P3D); 10 scene=new Scene(this); 11 scene.setGridIsDrawn(true);//设定绘制网格 12 scene.setCameraType(Camera.Type.ORTHOGRAPHIC);//设定摄像机透视类型 13 scene.showAll(); 14 15 boxes=new ArrayList<Box>(); 16 17 cp5=new ControlP5(this); 18 cp5.setAutoDraw(false); 19 cp5.addButton("add").setPosition(0, 0);//增加两个按钮 20 cp5.addButton("delete").setPosition(0, 20); 21 } 22 23 void draw() { 24 background(0); 25 26 for (Box b:boxes) { 27 b.draw(); 28 } 29 30 scene.beginScreenDrawing(); 31 cp5.draw(); 32 scene.endScreenDrawing(); 33 } 34 35 void controlEvent(ControlEvent theEvent) { 36 if (theEvent.getName()=="add") { 37 boxes.add(new Box(scene, random(-50, 50), random(-50, 50), 0));//增加一个Box对象 38 } 39 else if (theEvent.getName()=="delete"&&boxes.size()>0) { 40 boxes.remove(boxes.size()-1);//删除最后一个Box对象,注意前提是boxes里至少还有一个元素 41 } 42 }
具体说明下:
必须设定Processing在P3D模式下工作(废话);
Scene是ProScene的核心类,这里只需要记住如何构造,和上面几个简单的设定就好了,后面有详解。
ArrayList<?>的相关用法如有不明确的,请看准备篇对应的教程。
ControlP5的相关用法如有不明确的,请看准备篇对应的教程。
那么我们点击运行,看一下我们的战果:
拖拽鼠标左键(旋转),右键(平移),中键(缩放),即可与摄像机交互:
点击ADD随机增加Box对象,于网格所在平面,而DELETE则是删除:
鼠标移至对象的位置,对象变红(选中),按住鼠标左键旋转,右键平移,具体方向取决于你的摄像机方向,而如何增加限定,比如只限于x轴y轴,后面会有详细的介绍:
至此,一个基于面向对象的简单的3D图形交互浏览器的实例就完成了。
本文版权归梦神奇工作室所有,如需转载,请说明。