如蒙转载,请注明本帖出处:http://bogey.cn/?p=32
e文原教程地址:http://papervision2.com/tutorial-list/
7.鼠标基础交互
这一章我们给奶牛加上简单的鼠标交互,以便通过鼠标来移动旋转奶牛。
代码十分简单,作者直接贴上了源码(翻译的屎,保留e文注释)
- package{
- import PaperBase;
- import org.papervision3d.object.DisplayObject3D;
- import org.papervision3d.objects.parsers.Collada;
- public class Main extends PaperBase{
- public var cow:DisplayObject3D;
- public var disance:Number = 1000;//Distance the camera should be from the model
- //摄像机和奶牛的大概的距离
- public function Main(){
- init();
- }
- override protected function init3d():void{
- //cow不是DisplayObject3D么,这里怎么变成了new Collada?这里是因为Collada是DisplayObject3D的一个子类,所以你可以这么干
- cow = new Collada("http://bogey.cn/wp-content/uploads/2008/09/cow.dae");
- cow.moveDown(100);//将模型往下移
- cow.scale=3;//再放大点
- default_scene.addChild(cow);//吧奶牛添加到场景
- }
- override protected function processFrame():void{
- // The next line is a bit of a mouthful, but it's quite simple really.
- // It just gets the Y position of your mouse, and sets the camera.y to a
- // value between -800 and 800, depending on the Y position of your mouse
- // (If mouseY = 0 then camera.y = 800. If mouseY = stage.height, camera.y = -800)
- //下面的话非常重要,也非常的简单
- //根据你的鼠标y坐标来设置摄像机的Y坐标(在-800到800之间)
- //如果鼠标y坐标为0则摄像机坐标为800,如果鼠标坐标为舞台的高度,则摄像机的y为-800
- default_camera.y = -(((mouseY - (stage.height / 2)) / stage.height) * 1600);
- // We don't want the camera to move further away from the model, so we do this:
- //防止摄像机离奶牛模型太远
- default_camera.moveForward(default_camera.distanceTo(cow) - distance);
- // We now want to rotate the object depending on
- // the Xmouse position. This is really simple.
- //下面的是使用鼠标x坐标来控制模型旋转
- cow.rotationY = -((mouseX / stage.width) * 360) //Rotation
- // NOTE: This will only work if you only have one object in your scene
- // I'll write a more advanced movement tutorial soon :)
- //以上仅仅是只有一个物体的场景
- //作者将在后续篇章中讲解一些更高级的内容
- }
- }
- }
我的代码为:
- package tutorial {
- import org.papervision3d.object.DisplayObject3D;
- import org.papervision3d.objects.parsers.Collada;
- /**
- * ...
- * @author $(DefaultUser)
- */
- public class InteractiveCow extends PaperBase{
- public var cow:DisplayObject3D;
- public function InteractiveCow() {
- super();
- }
- override protected function init3d():void {
- cow = new Collada("http://bogey.cn/wp-content/uploads/2008/09/cow.dae");
- cow.scale = 3;
- cow.moveDown(100);
- default_scene.addChild(cow);
- //因为我的下的是最新的papervision源码,按作者的代码来测试摄像机总是在y轴移动
- //所以加上了这句话,让摄像机以奶牛为中心,这样效果才能和作者的效果一样
- default_camera.target = cow;
- }
- override protected function processFrame():void {
- default_camera.y = -(((mouseY - (stage.height / 2)) / stage.height) * 1600);
- default_camera.moveForward(default_camera.distanceTo(cow) - distance);
- cow.rotationY = -((mouseX / stage.width) * 360)
- }
- }
- }
我的Main.as为:
- package {
- import flash.display.Sprite;
- import flash.events.Event;
- import tutorial.SimpleCone;
- /**
- * ...
- * @author DefaultUser (Tools -> Custom Arguments...)
- */
- [SWF(width='800',height='600',backgroundColor='0x000000',frameRate='30')]
- public class Main extends Sprite {
- public function Main():void {
- if (stage) init();
- else addEventListener(Event.ADDED_TO_STAGE, init);
- }
- private function init(e:Event = null):void {
- if(e!=null)removeEventListener(Event.ADDED_TO_STAGE, init);
- addChild(new InteractiveCow)
- }
- }
- }
如蒙转载,请注明本帖出处:http://bogey.cn/?p=31
e文原教程地址:http://papervision2.com/tutorial-list/
6.载入复杂模型(噢,奶牛!orz)
这一章我们还是继续学习在papervision中创建物体,也许你已经对那个简陋的圆锥厌烦了,这次来点复杂的怎么样?一个奶牛,它看起来效果很不错,但别担心,创建它的代码很简单。
我们还是在上一章的基础上修改代码,现在打开上次的项目。让我们开始奶牛之旅。
首先我们需要导入org.papervision3d.object.DisplayObject3D用于保存我们的模型,实际上它储存了几何形体,材质,以及坐标点,旋转等所有和模型物体相关的东西。另外我们还需要导入
org.papervision3d.objects.parsers.Collada用于解析我们的Collada文件。(Collada是一种使用xml标记语言来描述一个3d物体的文件格式,你可以使用记事本来查看相关的文件内容,maya似乎直接支持Collada文件导出,而max则需要一个插件)
- import PaperBase;
- import org.papervision3d.object.DisplayObject3D;
- import org.papervision3d.objects.parsers.Collada;
只需要导入以上3个类就可以了。
现在我们把原来的圆锥体修改成奶牛,hoho,找到public var cone:Cone将其修改为:
public var cow:DisplayObject3D;
以上代码声明一个叫cow的变量,用于存储我们的奶牛模型,然后我们转到init3d()方法里来,在这里我们要载入collada文件并初始化它:
- override protected function init3d():void{
- //cow不是DisplayObject3D么,这里怎么变成了new Collada?这里是因为Collada是DisplayObject3D的一个子类,所以你可以这么干
- cow = new Collada("http://bogey.cn/wp-content/uploads/2008/09/cow.dae");
- cow.moveDown(100);//将模型往下移
- cow.scale=3;//再放大点
- cow.pitch(-30);//稍微倾斜对准摄像机
- default_scene.addChild(cow);//吧奶牛添加到场景
- }
以上代码就将奶牛加载到了我们的场景里,对与Collada文件的加载,解析,以及初始化模型材质,这些统统由Collada类做了,我们所需要的只是向它提供一个collada文件地址,简单吧?
由于跨域的原因,你需要将材质图片和collada文件下载下来使用,右键点击下面链接下载。
材质:
collada文件
最后我们还需要修改processFrame方法里的代码让奶牛旋转起来,将原来的cone.yaw(5)修改为cow.yaw(5),大功告成,Ctrl+enter看看你的奶牛吧!
完整的代码如下:
- package{
- import PaperBase;
- import org.papervision3d.object.DisplayObject3D;
- import org.papervision3d.objects.parsers.Collada;
- public class Main extends PaperBase{
- public var cow:DisplayObject3D;
- public function Main(){
- init();
- }
- override protected function init3d():void{
- //cow不是DisplayObject3D么,这里怎么变成了new Collada?这里是因为Collada是DisplayObject3D的一个子类,所以你可以这么干
- cow = new Collada("http://bogey.cn/wp-content/uploads/2008/09/cow.dae");
- cow.moveDown(100);//将模型往下移
- cow.scale=3;//再放大点
- cow.pitch(-30);//稍微倾斜对准摄像机
- default_scene.addChild(cow);//吧奶牛添加到场景
- }
- override protected function processFrame():void{
- cow.yaw(5);//每帧旋转5
- }
- }
- }
我的代码为:
- package tutorial {
- import org.papervision3d.object.DisplayObject3D;
- import org.papervision3d.objects.parsers.Collada;
- /**
- * ...
- * @author $(DefaultUser)
- */
- public class CowModel extends PaperBase{
- public var cow:DisplayObject3D;
- public function CowModel() {
- super();
- }
- override protected function init3d():void {
- cow = new Collada("http://bogey.cn/wp-content/uploads/2008/09/cow.dae");
- cow.scale = 3;
- cow.moveDown(100);
- //cow.pitch( -10);
- default_scene.addChild(cow);
- }
- override protected function processFrame():void {
- cow.yaw(1);
- }
- }
- }
我的Main.as为:
- package {
- import flash.display.Sprite;
- import flash.events.Event;
- import tutorial.SimpleCone;
- /**
- * ...
- * @author DefaultUser (Tools -> Custom Arguments...)
- */
- [SWF(width='800',height='600',backgroundColor='0x000000',frameRate='30')]
- public class Main extends Sprite {
- public function Main():void {
- if (stage) init();
- else addEventListener(Event.ADDED_TO_STAGE, init);
- }
- private function init(e:Event = null):void {
- if(e!=null)removeEventListener(Event.ADDED_TO_STAGE, init);
- addChild(new CowModel)
- }
- }
- }
如蒙转载,请注明本帖出处:http://bogey.cn/?p=30
e文原教程地址:http://papervision2.com/tutorial-list/
5.基础材质
光一个线框太不美观了?那试试给它贴上一个材质,嘿嘿。
首先打开上一篇教程所创建的项目,我们将在上次的基础上添加一些代码来贴上材质,我们将使用BitmapFileMaterial,我们先倒入它以备使用(在原来的import代码之后新起一行添加):
import org.papervision3d.materials.BitmapFileMaterial;
现在我们需要添加BitmapFileMaterial材质给我们的圆锥,在添加材质之前,我们先来了解下BitmapFileMaterial.
BitmapFileMaterial是papervision提供的众多材质中的一种,它允许你通过指定一个图片地址来创建一个材质,这对于加载collada模型并使用用户上传的材质进行渲染十分的有用。
当你创建了一个BitmapFileMaterial对象,你需要给它一个url来让他获取材质的图形。
现在我们来创建一个bitmapFileMatrial材质,并在我们的圆锥被创建时将这个材质付给它,代码十分简单:
将原来的
public var cone:Cone=new Cone();
改为:
public var cone:Cone = new Cone(new BitmapFileMaterial(”ourtex.jpg”));
由于跨域的原因,你需要将材质图片下载下来使用,右键点击下面的图片另存为下载。

Ctrl+Enter测试项目,你可以看到圆锥被贴上了红白相间的材质。呵呵,现在看起来效果还不错。
最后完整的代码如下:
- package{
- import PaperBase;
- import org.papervision3d.objects.primitives.Cone;
- import org.papervision3d.materials.BitmapFileMaterial;
- public class Main extends PaperBase{
- public var cone:Cone = new Cone(new BitmapFileMaterial("ourtex.jpg"));
- public function Main(){
- init();
- }
- override protected function init3d():void{
- cone.scale=3;//将圆锥放大一点
- cone.pitch(-40);//将圆锥倾斜以对准摄像机
- default_scene.addChild(cone);//将圆锥添加到场景
- }
- override protected function processFrame():void{
- cone.yaw(5);//每帧旋转5
- }
- }
- }
我的代码为:
- package tutorial {
- import flash.filters.GlowFilter;
- import org.papervision3d.objects.primitives.Cone;
- import org.papervision3d.materials.BitmapFileMaterial;
- /**
- * ...
- * @author $(DefaultUser)
- */
- public class SimpleCone extends PaperBase{
- private var cone:Cone;
- public function SimpleCone() {
- super();
- }
- override protected function init3d():void {
- cone = new Cone(new BitmapFileMaterial("http://bogey.cn/wp-content/uploads/2008/09/ourtex.jpg"));
- cone.scale = 3;
- cone.pitch(-15);
- default_scene.addChild(cone);
- }
- override protected function processFrame():void {
- cone.yaw(1);
- }
- }
- }
我的Main.as为:
- package {
- import flash.display.Sprite;
- import flash.events.Event;
- import tutorial.SimpleCone;
- /**
- * ...
- * @author DefaultUser (Tools -> Custom Arguments...)
- */
- [SWF(width='800',height='600',backgroundColor='0x000000',frameRate='30')]
- public class Main extends Sprite {
- public function Main():void {
- if (stage) init();
- else addEventListener(Event.ADDED_TO_STAGE, init);
- }
- private function init(e:Event = null):void {
- if(e!=null)removeEventListener(Event.ADDED_TO_STAGE, init);
- addChild(new SimpleCone)
- }
- }
- }