在这个教程中,你将学会如何创建一个地板对象,本教程中的地板是可交互的并且能够移动小方块到鼠标的点击的地方。

1. 设置场景:

你正在创建的场景包含了一个平面,地板和一个看起来像一个饰品的方块,还有一个对着整个场景的相机。首先你应该创建一个View3D对象并且设置如下的相机属性。

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT; //setup the view
_view = new View3D();
addChild(_view); //setup the camera
_view.camera.z = -600;
_view.camera.y = 500;
_view.camera.lookAt(new Vector3D());

现在场景设置好了,你可以增加对象了,小方块的边长是100 并且有一个 1x1x1 的分段。这样在每个面看起来都包括两个三角形,CubeGeometry构造函数中的最后一个变量 tile6决定了随后的纹理参数如何映射到多维数据集。这个例子中,false 意味着一个图像将在小方块的每个面重复出现。

//setup the scene
_cube = new Mesh(new CubeGeometry(100, 100, 100, 1, 1, 1, false), new TextureMaterial(Cast.bitmapTexture(TrinketDiffuse)));
_cube.y = 50;
_view.scene.addChild(_cube);

注意:小方块的Y属性被设置为50.这个立方体的中心复位垂直50单位(一半是高度),给人的印象立方体是躺在地板上。下一步,你要增加地板面,这个和之前的   基本视图教程 是一样的。

_plane = new Mesh(new PlaneGeometry(700, 700), new TextureMaterial(Cast.bitmapTexture(FloorDiffuse)));
_view.scene.addChild(_plane);

2. 使它能够交互

你的场景已经设置好了,现在是时候让他动起来了。首先你需要给地板对象增加一些额外的属性。以便当你用鼠标点击对象的时候能够抓取相应的信息。

第一步,你需要定义使用哪个鼠标动作(左键,右键等),

第二步,你需要启用鼠标动作对这个对象操作,默认是不可用的。这是为了减少系统开销。(自己想的)。鼠标采集系统允许你选择快/慢的精确度或者更慢/更快的精确度根据你自己的需要。

最后,你需要增加一个鼠标事件的监听器。当放开鼠标按钮的时候,调用一个方法。使用MouseEvent3D.MOUSE_UP事件。

_plane = new Mesh(new PlaneGeometry(700, 700), new TextureMaterial(Cast.bitmapTexture(FloorDiffuse)));
_plane.pickingCollider = PickingColliderType.AS3_FIRST_ENCOUNTERED;
_plane.mouseEnabled = true;
_view.scene.addChild(_plane);
 
//add mouse listener
_plane.addEventListener(MouseEvent3D.MOUSE_UP, _onMouseUp);

想要了解全部的鼠标点击系统,请参考之前的教程(我自己还没翻译。。。。)

3. 给方块加上动画。----渐变

你的对象已经放上去了,地板现在也能响应鼠标点击了,但是目前却不能做别的。现在你可以增加剩余的功能----根据鼠标的点击来移动小方块。当监听程序接收到MouseEvent3D.MOUSE_UP的事件,关于3d鼠标的信息就被存储到了event 的变量中。

在这个样例中,你需要知道鼠标点击地板的坐标。然后才能移动小方块到这个地方。幸运的是,Away3D在鼠标事件中存储了这些信息,你只需要取出即可。

假定你已经有了鼠标点击的位置的坐标,现在我们想要慢慢的移动小方块到那个地方。这需要一个库文件。该例子使用了Tweener 这个类。

你的方块将通过一个曲线运动从当前的位置移动到新的位置。Y坐标并不需要改变,这次你只关心X 和 Z 坐标。你需要首先初始化你要使用的曲线对象。用下面的方法即可。这个只需要初始化一次即可。因此在类的构造函数中调用。

//initialize Tweener curve modifiers
CurveModifiers.init();

MouseEvent.MOUSE_UP 事件监听函数创建了一个新的Tweener对象来移动方块。方块对象是第一个变量,第二个变量是一个对象包含如下“To”位置的属性值。有许多特殊的属性能够影响tween 函数。例如:“Time”改变了整体的持续时间。“_bezier” 属性定义了 贝塞尔曲线 的控制点来控制对象移动的路线。

/**
* mesh listener for mouse up interaction
*/
private function _onMouseUp(ev:MouseEvent3D) : void
{
Tweener.addTween(_cube, { time:0.5, x:ev.scenePosition.x, z:ev.scenePosition.z, _bezier:{x:_cube.x, z:ev.scenePosition.z} });
}

这个样例也包含一个Event.ENTER_FRAME 处理函数和一个响应Event.RESIZE函数的舞台对象。Event.ENTER_FRAME这个函数只是调用了一下 _view.render()方法来确保场景被重新描绘。同时,RESIZE处理函数确保3D场景占用全屏。

当你点击地板的时候,你将看到小方块通过贝塞尔曲线移动到你鼠标点击的那个位置。

总结:

在这个教程中。你在一次看到了如何构造一个简单的包含一定数量对象的场景。同时,你也了解了如何通过鼠标来实现和场景中对象的交互,以及实现对相对于鼠标事件的响应。

Away 3D 之 交互和渐变----Interactivity and Tweening的更多相关文章

  1. AlloyTouch与three.js 3D模型交互

    如你所见,上面的cube的旋转.加速.减速停止都是通过AlloyTouch去实现的. 演示 代码 <script src="asset/three.js"></s ...

  2. 如何实现TWaver 3D颜色渐变

    一般而言,须要实现3D物体的渐变,通常的思路就是通过2D绘制一张渐变canvas图片作为3D对象的贴图.这样的方式是能够解决这类问题的.只是对于一般用户而言,通过2D生成一张渐变的图片.有一定的难度, ...

  3. 基于 WebGL 3D 的 HTML5 档案馆可视化管理系统

    前言 档案管理系统是通过建立统一的标准以规范整个文件管理,包括规范各业务系统的文件管理的完整的档案资源信息共享服务平台,主要实现档案流水化采集功能.为企事业单位的档案现代化管理,提供完整的解决方案,档 ...

  4. 基于 HTML5 的 WebGL 3D 档案馆可视化管理系统

    前言 档案管理系统是通过建立统一的标准以规范整个文件管理,包括规范各业务系统的文件管理的完整的档案资源信息共享服务平台,主要实现档案流水化采集功能.为企事业单位的档案现代化管理,提供完整的解决方案,档 ...

  5. 基于 HTML5 的工业组态高炉炼铁 3D 大屏可视化

    前言 在大数据盛行的现在,大屏数据可视化也已经成为了一个热门的话题.大屏可视化可以运用在众多领域中,比如工业互联网.医疗.交通.工业控制等等.将各项重要指标数据以图表.各种图形等形式表现在一个页面上, ...

  6. 论文翻译——Rapid 2D-to-3D conversion——快速2D到3D转换

    https://blog.csdn.net/qq_33445835/article/details/80143598  目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...

  7. Rapid 2D-to-3D conversion——快速2D到3D转换

    https://blog.csdn.net/qq_33445835/article/details/80143598  目前想做一个关于2D转3D的项目,由于国内资料比较少而且大部分都是基于国外的研究 ...

  8. Unity3D实现3D立体游戏原理及过程

    Unity3D实现3D立体游戏原理及过程 183 0 0     下面的教程是我今天整理的资料,教大家一步步完成自己的3D立体游戏,并向大家介绍一些3D成像的原理.     理论上,每个普通的非立体3 ...

  9. Android线性渐变

    布局实现: 1. 在res中建立drawable文件夹. 2. 在drawable文件夹中建立shape.xml. 3. shape.xml的代码如下: <?xml version=" ...

随机推荐

  1. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  2. Project Euler 97 :Large non-Mersenne prime 非梅森大素数

    Large non-Mersenne prime The first known prime found to exceed one million digits was discovered in ...

  3. hdu 3972 1 M possible

    一般做法: 显然的超内存 #include<stdio.h> #include<algorithm> using namespace std; ],ans[]; int mai ...

  4. 龙芯将两款 CPU 核开源,这意味着什么?

    10月21日,教育部计算机类教学指导委员会.中国计算机学会教育专委会将2016 CNCC期间在山西太原举办“面向计算机系统能力培养的龙芯CPU高校开源计划”活动,在活动中,龙芯中科宣布将GS132和G ...

  5. SVN 目录结构

    Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-ta ...

  6. C++:概述

    1.基本的输入输出,使用cin>>输入输入.使用cout<<输出 #include<iostream> using namespace std; int main( ...

  7. 在屏幕上显示C盘根目录下的所有文件和文件夹

    1 import java.io.File; //在屏幕上显示C盘根目录下的所有文件和文件夹 public class ListDemo { public static void main(Strin ...

  8. 海明距离hamming distance

    仔细阅读ORB的代码,发现有很多细节不是很明白,其中就有用暴力方式测试Keypoints的距离,用的是HammingLUT,上网查了才知道,hamming距离是相差位数.这样就好理解了. 我理解的Ha ...

  9. python3.4安装suds

    使用suds访问webservice十分方便 python3.x安装suds会报错“No module named client” 在stackoverflow上找到了替代方法,安装suds-jurk ...

  10. Android中常见的MVC模式

    MVC模式的简要介绍 MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller). MVC模式的目的就是实现Web系统的职能分工. Model层实现系统中的业务 ...