你自己的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图形交互浏览器的实例就完成了。

 

本文版权归梦神奇工作室所有,如需转载,请说明。

posted @ 2014-03-19 10:20  梦神奇工作室  阅读(3850)  评论(4编辑  收藏  举报