|
|
最近更新:
●
wan925446570阁下在 讨论区里
回复“怎么配置away3d 4.0运行环境啊?...”(15:12:45)
●
wan925446570阁下在 讨论区里
回复“怎么配置away3d 4.0运行环境啊?...”(10:01:38)
●
DDM君阁下在 讨论区里
回复“怎么配置away3d 4.0运行环境啊?...”(19:07:43)
|
|
|
浏览主题:想做个魔方的效果
想做个魔方的效果
落日夕阳斜 (2009-07-06 11:45:10)
最近想用pv3d做个魔方的效果,最终的想法是可以像真正的魔方那样转的。 但是第一步我想先实现一个样子就好了。 我想魔方有27个小立方体组成。 var DDDArray:Array=new Array; for (k=0; k<27; k++) { var _displayObj:DisplayObject3D=new Cube(materialList,100,100,100,2,2,2); DDDArray[k]=_displayObj; _scene.addChild(DDDArray[k]); } 但是这样之后每个立方体的坐标不知道怎么弄才好,我是用我能想到的笨办法弄的 if (k<3) { this.DDDArray[k].x=k*xpos; } else if (k>=3&&k<6) { this.DDDArray[k].x=(k-3)*xpos; this.DDDArray[k].y=xpos; } .... else if(k>=24&&k<27){ this.DDDArray[k].x=(k-24)*xpos; this.DDDArray[k].z=-xpos*2; this.DDDArray[k].y=xpos*2; } 这样出来后,有的立方体应该背其他立方体遮挡住的,但是跑到了另一个的上面。 哎不知道怎么处理才好。 帮我想想好的办法
 |
(2009-07-06 14:18:55) |
还有这么多立方体,怎么让他们一起转,我以前问过,但是还是没明白。 DDM君,能不能把简单的代码写一下^_^
|
 |
(2009-07-06 18:36:11) |
数据用[3][3][3] 的数组表示 不用确定坐标,因为旋转是有中间过程的,直接将要旋转的3x3 数组绕轴旋转过去就可以了。矩阵里有绕轴选择函数
|
 |
(2009-07-07 09:33:21) |
首先还是要熟悉这个更换旋转轴的例子。 http://www.flab3d.com/tutorial.php?top=t18cell
魔方一共只有9种旋转方法,所以需要9个虚拟物体,这些虚拟物体的目的就是为了固定每种旋转的中心点。 需要执行某种转动时,就动态的将相关的9个立方体,子级给相应的虚拟物体,然后对这个虚拟物体进行转动即可。
问题在于到底如何让用户控制,我觉得让用户直接点击立方体是不合适的,因为密集的物体深度排列的前后会有问题,即使点击中某个立方体也很难说该怎么转动。 关于深度排列的解释: http://www.flab3d.com/tutorials_06_Zsorting.php
|
 |
(2009-07-09 17:35:13) |
嗨,基本上弄好了!但是我想试试以前的教程里有个鼠标交互的帖子,但是报错:1119: 访问可能未定义的属性 interactive (通过 static 类型 org.papervision3d.materials:MaterialsList 引用)。
---------------------------- 原来代码是这样的: import fl.transitions.Tween; import fl.transitions.TweenEvent; import fl.transitions.easing.Regular;
import org.papervision3d.cameras.Camera3D; import org.papervision3d.scenes.MovieScene3D; import org.papervision3d.materials.MaterialsList; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.BitmapFileMaterial; import org.papervision3d.core.proto.MaterialObject3D; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.Sphere; import org.papervision3d.objects.Cylinder; import org.papervision3d.objects.Cube; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.events.InteractiveScene3DEvent;
var _container:MovieClip; var _scene:MovieScene3D; var _camera:Camera3D; var _material:MaterialObject3D; var CubeContainer:DisplayObject3D=new DisplayObject3D ;
var _material1:BitmapFileMaterial; var _material2:BitmapFileMaterial; var _material3:BitmapFileMaterial; var _material4:BitmapFileMaterial; var _material5:BitmapFileMaterial; var _material6:BitmapFileMaterial;
var i:int=0; var j:int=0; var k:int=0; var xpos:Number=55; var DDDArray:Array=new Array(new Array(new Array(),new Array(),new Array()),new Array(new Array(),new Array(),new Array()),new Array(new Array(),new Array(),new Array())); var colorArray:Array=new Array("0xff0066","0x6633cc",""); Init3D();
function Init3D():void { _container=new MovieClip ; _container.x=stage.stageWidth/2; _container.y=stage.stageHeight/2; tainer.addChild( _container );
// 创建3D舞台 _scene=new MovieScene3D(tainer); // 创建摄像头 _camera = new Camera3D(); _camera.z=-500; _camera.zoom=5; _camera.rotationY=45;
var materialList:MaterialsList = new MaterialsList(); materialList.interactive=true materialList.addMaterial(new ColorMaterial(0x66CC00), "top"); materialList.addMaterial(new ColorMaterial(0x6600FF), "bottom"); materialList.addMaterial(new ColorMaterial(0xFF0066), "front"); materialList.addMaterial(new ColorMaterial(0x0066FF), "back"); materialList.addMaterial(new ColorMaterial(0x999999), "left"); materialList.addMaterial(new ColorMaterial(0xffcc00), "right");
for (i=0; i<3; i++) { for (j=0; j<3; j++) { for (k=0; k<3; k++) { var _displayObj:DisplayObject3D=new Cube(materialList,54,54,54,2,2,2); DDDArray[i][j][k]=_displayObj; CubeContainer.addChild(DDDArray[i][j][k]); DDDArray[i][j][k].x=i*xpos-105/2; DDDArray[i][j][k].y=j*xpos-105/2; DDDArray[i][j][k].z=k*xpos-105/2; DDDArray[i][j][k].interactive=true DDDArray[i][j][k].addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, objOver); function objOver(e:InteractiveScene3DEvent):void { e.target.scaleX=1.2; e.target.scaleX=1.2; trace(e.target) } } } } _scene.addChild(CubeContainer);
_container.alpha=1; _scene.renderCamera(_camera);
addEventListener(Event.ENTER_FRAME, OnEnterFrame); } function OnEnterFrame(event:Event):void { /* CubeContainer.rotationY++; CubeContainer.rotationZ++; CubeContainer.rotationX++;*/ _scene.renderCamera(_camera); }
------------------------------- 教程里是 viewport=new Viewport3D(400,400); viewport.interactive=true; 我这个代码里没有viewport,不知道怎么加, 而且加了 materialList.interactive=true后就报错了。
|
 |
(2009-07-09 17:47:36) |
没加交互的
http://www.1000shou.com.cn/test/test/
|
 |
(2009-07-09 17:56:21) |
而且模型缺乏质感,有没有什么办法补救呢
|
 |
(2009-07-10 09:08:10) |
感觉挺不错的!!深度排列看上去也没有问题。 materialList是没有.interactive属性的,interactive的是每个具体的贴图。
缺乏质感这个问题是贴图美工的事情啦,一块纯的颜色当然没有质感嘛,呵呵。
|
 |
(2009-07-10 09:50:23) |
那样的话,如果说我立方体,有六个贴图的话,鼠标交互应该定义在哪个贴图上呢
|
 |
(2009-07-10 10:46:58) |
我现在做的东西,都是基于研究所的一些例子改的代码。要是让自己完全的去做,就不知道该用什么,比如灯光啊,viewport,之类的,要不要加,在什么情况下需要加呢。
|
 |
(2009-07-10 11:20:57) |
灯光什么的在全是立方体的场合里是没有什么意义的。
光影主要还是靠贴图。
6贴图是不够的,因为pv3d是按贴图来侦测点击的哪个,所以需要读取27次(好像还计算少了)贴图,分别加入侦听才行。
说实话,在下还是没有想到,应该怎么用鼠标控制转魔方。
|
 |
(2009-07-14 16:29:58) |
如果只是点击立方体的面,程序自然无法知晓用户的意图。 我想可以通地拖动来控制转动。根据鼠标按下后的移动轨迹来得到用户想让魔方如何转动。
|
 |
(2009-07-14 18:16:19) |
落日夕阳斜君的想法前段时间我也考虑过。关于质感的问题,我感觉用斜角滤镜进行处理比较好,比灯光消耗要少很多,而且效果会比较好。但是旋转的时候用来控制斜角角度的算法还在思考中
|
 |
(2009-07-15 11:06:56) |
苦思冥想中....>_<
|
 |
(2009-11-25 11:51:48) |
smallCubeBitmap = new BitmapFileMaterial("small.jpg"); smallCubeBitmap.interactive=true;
为啥报错1119: 访问可能未定义的属性 interactive (通过 static 类型 org.papervision3d.materials:BitmapFileMaterial 引用)。
|
 |
DDM君 (2009-11-25 12:08:49) |
光看这两句,是没有任何问题的。
|
 |
(2009-11-25 13:54:49) |
//materials texture_t=new BitmapAssetMaterial("top"); texture_b=new BitmapAssetMaterial("back"); texture_r=new BitmapAssetMaterial("right"); texture_f=new BitmapAssetMaterial("front"); texture_l=new BitmapAssetMaterial("left"); texture_d=new BitmapAssetMaterial("bottom"); // texture_t.oneSide=true; texture_b.oneSide=true; texture_r.oneSide=true; texture_f.oneSide=true; texture_l.oneSide=true; texture_d.oneSide=true; //planes top=new Plane(texture_t,600,600,4,4); back=new Plane(texture_b,600,600,4,4); right=new Plane(texture_r,600,600,4,4); front=new Plane(texture_f,600,600,4,4); left=new Plane(texture_l,600,600,4,4); bottom=new Plane(texture_d,600,600,4,4); //将各plane添加到scene中 scene.addChild(front,"front"); scene.addChild(left,"left"); scene.addChild(right,"right"); scene.addChild(top,"top"); scene.addChild(bottom,"bottom"); scene.addChild(back,"back");
//添加小立方体 smallCubeBitmap = new BitmapFileMaterial("small.jpg"); smallCubeBitmap.interactive=true; var materials_S:MaterialsList = new MaterialsList({all:smallCubeBitmap}); smallCube = new Cube( materials_S, 200/6, 200/6, 200/6, 16, 16, 16, Cube.NONE); scene.addChild( smallCube, "smallCube" ); smallCube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onMouseDownOnCube);
基本想法就是设定6个面(类似房屋内部),然后添加一个小cube,想用鼠标点击cube,但是smallCubeBitmap.interactive=true;这句总是报错~~
|
 |
DDM君 (2009-11-27 10:30:46) |
您是用的我们的傻瓜包吗?我帮您看过了,interactive这个属性是有的,不应该抱错找不到的。
|
 |
(2009-12-02 17:15:07) |
谢谢DDM君,问题解决了~
|
 |
(2009-12-02 17:17:31) |
DDM君,反复的在场景中scene.removeChild(),scene.addChild(),会不会导致内存无法释放?
|
 |
DDM君 (2009-12-03 17:16:02) |
能分享一下大概是什么问题,然后如何解决的吗^_^ ?
|
 |
(2009-12-07 10:13:53) |
呵呵,我使用了Papervision3D_2.1.920.swc这个包~,同样的语句就编译没问题了
|
|
|