快速导航:   教程资源  | 经典范例  | 友情链接  | 联系我们  | 官方微博
登陆 | 注册

 flash 3d 研究所
flash3d 研究所 pv3d 教程 研究所小贴士: 站在5米外看10米高的楼,和100米外看10米的楼能一样高吗? 三维世界和二维世界的尺寸本来就不一样,不要钻牛角尖啦 ~










最近更新:
● 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;
}
这样出来后,有的立方体应该背其他立方体遮挡住的,但是跑到了另一个的上面。
哎不知道怎么处理才好。
帮我想想好的办法





flash 3d 研究所
(2009-07-06 14:18:55)
还有这么多立方体,怎么让他们一起转,我以前问过,但是还是没明白。
DDM君,能不能把简单的代码写一下^_^


flash 3d 研究所
(2009-07-06 18:36:11)
数据用[3][3][3]
的数组表示
不用确定坐标,因为旋转是有中间过程的,直接将要旋转的3x3
数组绕轴旋转过去就可以了。矩阵里有绕轴选择函数


flash 3d 研究所
(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



flash 3d 研究所
(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后就报错了。



flash 3d 研究所
(2009-07-09 17:47:36)
没加交互的

http://www.1000shou.com.cn/test/test/


flash 3d 研究所
(2009-07-09 17:56:21)
而且模型缺乏质感,有没有什么办法补救呢


flash 3d 研究所
(2009-07-10 09:08:10)
感觉挺不错的!!深度排列看上去也没有问题。
materialList是没有.interactive属性的,interactive的是每个具体的贴图。

缺乏质感这个问题是贴图美工的事情啦,一块纯的颜色当然没有质感嘛,呵呵。


flash 3d 研究所
(2009-07-10 09:50:23)
那样的话,如果说我立方体,有六个贴图的话,鼠标交互应该定义在哪个贴图上呢


flash 3d 研究所
(2009-07-10 10:46:58)
我现在做的东西,都是基于研究所的一些例子改的代码。要是让自己完全的去做,就不知道该用什么,比如灯光啊,viewport,之类的,要不要加,在什么情况下需要加呢。


flash 3d 研究所
(2009-07-10 11:20:57)
灯光什么的在全是立方体的场合里是没有什么意义的。

光影主要还是靠贴图。

6贴图是不够的,因为pv3d是按贴图来侦测点击的哪个,所以需要读取27次(好像还计算少了)贴图,分别加入侦听才行。

说实话,在下还是没有想到,应该怎么用鼠标控制转魔方。


flash 3d 研究所
(2009-07-14 16:29:58)
如果只是点击立方体的面,程序自然无法知晓用户的意图。
我想可以通地拖动来控制转动。根据鼠标按下后的移动轨迹来得到用户想让魔方如何转动。




flash 3d 研究所
(2009-07-14 18:16:19)
落日夕阳斜君的想法前段时间我也考虑过。关于质感的问题,我感觉用斜角滤镜进行处理比较好,比灯光消耗要少很多,而且效果会比较好。但是旋转的时候用来控制斜角角度的算法还在思考中


flash 3d 研究所
(2009-07-15 11:06:56)
苦思冥想中....>_<


flash 3d 研究所
(2009-11-25 11:51:48)
                 smallCubeBitmap = new BitmapFileMaterial("small.jpg");
           smallCubeBitmap.interactive=true;

为啥报错1119: 访问可能未定义的属性 interactive (通过 static 类型 org.papervision3d.materials:BitmapFileMaterial 引用)。


flash 3d 研究所 DDM君
(2009-11-25 12:08:49)
光看这两句,是没有任何问题的。


flash 3d 研究所
(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;这句总是报错~~


flash 3d 研究所 DDM君
(2009-11-27 10:30:46)
您是用的我们的傻瓜包吗?我帮您看过了,interactive这个属性是有的,不应该抱错找不到的。


flash 3d 研究所
(2009-12-02 17:15:07)
谢谢DDM君,问题解决了~


flash 3d 研究所
(2009-12-02 17:17:31)
DDM君,反复的在场景中scene.removeChild(),scene.addChild(),会不会导致内存无法释放?


flash 3d 研究所 DDM君
(2009-12-03 17:16:02)
能分享一下大概是什么问题,然后如何解决的吗^_^ ?


flash 3d 研究所
(2009-12-07 10:13:53)
呵呵,我使用了Papervision3D_2.1.920.swc这个包~,同样的语句就编译没问题了


评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了