- 浏览: 305673 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
开发小菜:
支持IE9以下的吗?
HTML5+CSS3+JQuery打造自定义视频播放器 -
攻城使:
开发Html5必须得下载么,我用dw编写,把文件复制到myec ...
html5开发 myeclipse安装aptana插件 -
疾风鹰狼:
...
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码 -
sardodo:
你好,我想问下,导入例子中的.dae格式模型是可以看到旋转的小 ...
c3dl 初步认识 -
BIOHAZARDX:
下载学习,初学者膜拜一下。
html5 实现动画(三)
O3d 是一套开源的javascript API, 用来制作在浏览器中运行的3D 游戏,当然也可以用来展示商家的产品,做一些3D 模型。这系列教程会用一个个例子来展示如何写一个o3d 程序,展示o3d 所能够做的应用。
巧妇难为无米之炊,首先当然需要一些基本的东西,像o3d 插件,这个可以在google code 中获取,给个链接http://code.google.com/intl/zh-CN/apis/o3d/ ,还有O3d 的库文件,这个我是在下载的demo 中直接拷出来了(在本章最后上传的附件中)所需要的基本上就这些了,到后来要导入模型的话就再说了,至于IDE ,哪个写js 写得顺手就是哪个了,我比较喜欢用aptana 。 调试的话个人觉得firebug 就已经很强大了,像设置断点,查看局部变量等都很方便了。
这一章介绍一个最基本的o3d 程序应该有的框架,就像在windows 下要写一个最基本的opengl 程序一样,需要建立一个窗口,处理一些键盘和鼠标的消息,设置回调函数,还有建立一个3D 世界所必须的视口等等,刚开始会做很多像这样的初始化和设置工作,像windows 编程一样,一开始可能会让人感到迷茫,这么多繁杂的东西,都不知道是用来干嘛的,为什么不能调用一个函数就搞定一切呢,其实如果搞不懂的话,可以先完全不管这些,正如这章的标题,这只是个框架,你可以从教程中把demo 下下来,作为程序框架,然后在上面改就可以了。随着学习的深入,再回过头去看看,便会逐渐理解那些东西了。
好了,现在开始写一个最基本的o3d 程序吧。
首先,这个毕竟是在浏览器中运行的,所以一个基本的HTML 结构是必须的,当然还要包含一些基本的js 库文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>my first o3d application</title>
<script type="text/javascript" src="o3djs/base.js"></script>
<script type="text/javascript">
// 下面包含一些实用库
o3djs.require('o3djs.util');
o3djs.require('o3djs.math');
o3djs.require('o3djs.rendergraph');
o3djs.require('o3djs.primitives') ;
o3djs.require('o3djs.effect');
o3d 有一系列的库来帮助你简化一些繁琐的活,而你要调用其中的函数的话,只需要调用 o3djs.require('o3djs. ... ') 来包含所需要的类库。比如o3djs.math 中有许多数学运算的方法,进行矩阵的转换等等。
接下来就要设置这个o3d 开始的地方吧(其实就是当页面加载完后回调的函数,一般js 程序都要做的一件事)
// 当页面加载完后调用init() 函数
// 当页面被关掉后调用uninit() 函数
window.onload = init;
window.onunload = uninit;
在具体实现这两个函数前, 先把接下来要用的一些全局变量定义好
var g_o3d ;
var g_math ;
var g_client ;
var g_pack ;
var g_finished = false ; // for selenium testing
然后就要定义init ()函数了,这个函数其实就做了一件事,那就是再调用 o3djs.util.makeClients() 函数, 这个函数是已经实现了的,它用来查找在整个html 文档中是否有id 用o3d 开头的元素(像o3d ,o3d_elem,o3d_lang 都是可以的),然后再这个元素里面开辟一块区域( 一个object) ,这个就相当于windows 的窗口了,以后操作都是在这里面进行的,所以这个函数所做的其实跟windows 编程中的建立窗口差不多。
你也可以手工操作在html 中插入一个div
<!-- Start of O3D plugin -->
<div id="o3d" style="width: 600px; height: 600px;"></div>
<!-- End of O3D plugin -->
不过makeClients 毕竟是自动化的,它会在开始检测你的浏览器是否装了o3d 插件,你的插件是否过时了等等(很婆妈啊。。。。),然后据说这个函数能够帮你的o3d 应用加速。
扯了这么多,下面是这个很简洁的init 函数
function init () {
o3djs . util . makeClients ( initStep2 )
}
makeclients 的参数initStep2 是这个函数执行完毕后的回调函数。也就是说这个函数执行完后就执行initStep2 函数了。
如果说Init 函数是用来建立窗口的话,initStep2 函数就是用来初始化视口等这些一个3D 世界必须的东西。这些都可以说是套路吧,你程序不管怎么写,这些操作是必须的。
下面一步步来看initStep2 这个函数:
首先当然是定义这个函数了,clientElements 作为穿进去的参数,是makeClients 在找到id 是o3d 开头的元素后所建立的各个object 。
function initStep2(clientElements) {
接下来就要用到上面定义的各个全局变量了
var o3dElement = clientElements [ 0 ];
g_client = o3dElement . client ;
g_o3d = o3dElement . o3d ;
g_math = o3djs . math ;
o3dElement 是在HTML 中的一个元素,是DOM 的一部分(即是那个object )
g_client 是 整个o3d 应用的入口点,
g_o3d 是o3d 的命名空间,
g_math 是整个数学库的命名空间。
下面要创建一个包(pack) 来管理所有的对象(object) 和这些对象的生存时间,到后面讲到创建的模型,效果和材质时都是一个个对象。而这些对象就都由这个包来管理了
g_pack = g_client.createPack();
接下来创建一个渲染图(renderGraph) ,用库函数renderGraph.createBasicView() 产生一个标准的渲染图。这个渲染图有两个绘图列表,一个用于绘制非透明材质的元素(性能绘图列表),另一个用于绘制透明材质元素(透明效果绘图列表)
var viewInfo = o3djs . rendergraph . createBasicView (
g_pack ,
g_client . root ,
g_client . renderGraphRoot );
然后就是建立绘制背景(drawContext) 。绘制背景定义了投影方式(让一个3d 世界显示在平面的显示器中需要用到投影的知识了,其实就是把3 维坐标系中各个点的坐标乘以一个矩阵,然后就得到一个2 维坐标系的坐标,在游戏编程中基本上用到的只有透视投影),还有照相机的位置,这个照相机只是个比较形象的概念,跟真实世界中相似,3D 世界中的东西最后都是投到这个照相机上,而坐在电脑前的玩家也通过这个照相机看到了一个接近真实的世界。
// 建立一个基本的透视投影
viewInfo . drawContext . projection = g_math . matrix4 . perspective (
g_math . degToRad ( 30 ),
g_client . width / g_client . height ,
1 , // 近切面的Z 轴坐标.
5000 ); // 远切面的Z 轴坐标.
// 设置照相机
viewInfo . drawContext . view = g_math . matrix4 . lookAt ([ 0 , 1 , 5 ], // eye
[ 0 , 0 , 0 ], // target
[ 0 , 1 , 0 ]); // up
lookAt 方法有三个参数,第一个是照相机的位置坐标,第二个是照相机朝向的位置,第三个是照相机朝上位置的向量,比如[0,1,0] 就是正朝上。
好了,现在该基本的绘制背景已经设好了,照相机也准备好了,对准了适当的位置,现在就要在照相机前面的这个世界中放入你自己喜欢的东西了。这个要涉及到具体的模型,材质,纹理贴图等等细节了。这章暂不讨论。
到这里这章本该差不多结束了,除了在最后加个 unload() 然后把html 中的body 里的东西填一下。但是只是这样的话看不出有什么效果,这个是让人很不爽的,写了这么大堆东西连行不行都不知道,于是至少得在里面加一个东西,看看有什么效果啊。
下面这段代码就是用来创造一个球。
var effect = g_pack.createObject('Effect');
var material = g_pack.createObject('Material');
// Set the material's drawList.
material.drawList = viewInfo.performanceDrawList;
material.effect = effect;
var shape = o3djs.primitives.createSphere(g_pack, material, 0.5, 20, 20);
// Create a new transform and parent the Shape under it.
g_cubeTransform = g_pack.createObject('Transform');
g_cubeTransform.addShape(shape);
// Parent the cube's transform to the client root.
g_cubeTransform.parent = g_client.root;
加一个结束的标志
g_finished = true ; // for selenium testing.
}
程序结束调用的uninit() 函数,
function uninit() {
if (g_client) {
g_client.cleanup();
}
}
</script>
</head>
到这里还只是写了Html 中的head ,然后在body 中加入上文提到的id 是o3d 。。。的元素
<body>
<div id="o3d" style="width: 600px; height: 600px;"></div>
</body>
</html>
到这里一个简单的o3d 程序就完成了。
什么,你说这个不是球,只是一个很丑的圆,别激动嘛,这个确实是个球,不过还没有加上光照,材质和纹理,所以看不出立体感,不过能出来这个很丑的东西就说明你的程序能顺利运行了,接下要做的就是加上材质,纹理等等,把这个球美化起来。
发表评论
-
bufferData
2011-07-21 14:30 1041/*void*/ bufferData //缓冲区数 ... -
导入支持的格式(Import)
2011-05-31 16:54 2437导入对话框选择格式,你会看到众多导入的格式。3ds m ... -
法线贴图
2011-05-13 11:48 1901本文转自:http://yumi08.jimdo.co ... -
法线向量
2011-05-13 10:20 2510面法线的计算相对来 ... -
ShowWebGL 强大的3D模型查看器
2011-04-12 14:01 6100ShowWebGL http://showwebgl.com ... -
o3d 创建一个平面
2011-03-29 15:27 864var vertexInfo = o3djs.primitiv ... -
o3d 常见几何图形创建
2011-03-29 15:25 11061、基本形状包括: o3djs.primitives.cre ... -
o3D 材质-定义透明材质
2011-03-29 15:20 1083//定义一个为白色并且是透明材质 var material = ... -
o3D 光照设定材质的光反射系数
2011-03-29 15:19 9271、创建材质 2、设定效果 3、创建光源的位置 4、设置材质环 ... -
O3D程序基本结构
2011-03-29 15:13 810创建一个O3D对象 设置全局变量初始化通用库 创建一个O3D ... -
Google 三维 JavaScript API
2011-03-28 15:59 881O3D 是一个开源的Web API,其可以创建相当牛X的基于浏 ... -
3D引擎CopperLicht(二)
2011-03-28 15:14 1387在上一个课程的基础上 ... -
3D引擎CopperLicht
2011-03-28 15:09 1723WebGL是一种3D绘图标准, ... -
o3d 文档原文
2011-03-18 18:00 855Basic TasksThe basic tasks perf ... -
WebGL的框架
2011-03-18 16:23 3876WebGL的框架 WebGL http://www.khro ... -
c3dl 官方教程(二)
2011-03-18 16:13 1888教程#2:一个简单的场景本教程将展示C3DL)的基础知识使用三 ... -
C3DL 官方教程(一)
2011-03-18 15:57 1541本文笔者翻译,如有错误请留言。 教程#1:Web ... -
3D模型导入 CanvasMatrix.js引擎 demo(一)
2011-03-17 17:51 3027为广大html5 3d开发的朋友们演示 代码贴图,请下载附 ... -
c3dl 可以直接导入3dmax文件的3D引擎
2011-03-17 17:41 1157c3dl可以直接在网页代码中使用.dae格式的3dma ... -
o3d 模型导入引擎CanvasMatrix.js
2011-03-17 16:09 1618最近研究3d引擎在html5中的效果实现,需求当然是 ...
相关推荐
在这个"Java 2.5D游戏Demos"压缩包中,包含了一系列用Java编写的2.5D游戏示例,如俄罗斯方块和人物行走等。这些示例对于学习和理解Java游戏编程至关重要,因为它们提供了实际的代码和逻辑结构,可以帮助开发者掌握...
这些组件是构建用户界面的基础,API Demos会展示它们的基本用法和扩展能力。 2. **动画与图形**:展示了如何使用Animation、Transition和Canvas进行视觉效果的创建,包括属性动画、帧动画、视图动画,以及自定义...
通过深入研究Qt4.7的Demos,开发者不仅可以学习到Qt的基本用法,还能了解到高级特性和设计模式。这些示例代码可以直接复制到自己的项目中,作为起点或参考,极大地加速了开发过程。此外,Qt4.7的Demos也是理解和掌握...
在绘图部分,ApiDemos涵盖了Canvas、Paint、Path和Bitmap等基本图形绘制工具的用法,包括直线、曲线、填充、描边、颜色混合等操作。同时,它还展示了如何使用动画API,如ValueAnimator、ObjectAnimator和Property...
Android 6.0 强化了Material Design设计规范,API Demos中包含了许多展示Material Design组件和动画的示例,例如Floating Action Button (FAB)、Snackbar、Cards等,以及过渡和触摸反馈效果。 3. **Android Studio...
"ant-design-demos" 是一个基于Ant Design框架的示例集合,主要展示了Ant Design的各种组件和功能在实际应用中的使用方式。Ant Design是一款由阿里集团开发的高质量React UI库,它提供了一系列美观、易用且具有企业...
《Android ApiDemos apk:深入理解Android应用开发的实践指南》 Android ApiDemos apk是...通过深入研究和实践ApiDemos,开发者能够提升自己的编程技能,为构建高效、稳定且用户体验优秀的Android应用打下坚实的基础。
总的来说,"Demos.rar_3D射击游戏_d3d_d3d 游戏_shooting_游戏demo"为我们提供了一个学习和实践3D游戏开发的良好起点,通过深入研究和实践,开发者可以掌握D3D的核心技术和3D射击游戏的开发流程,进一步提升自己的...
通过深入研究这个源码,开发者不仅可以掌握Android 8.1 API的基本用法,还能了解到最佳实践和潜在的问题。在实际项目中遇到问题时,ApiDemos也可以作为一个参考,帮助找到解决方案。因此,无论是新手还是老手,都应...
《Java Demos实践教程:基于jdk-8u251-windows-x64-demos.zip的探索与学习》 Java Demos是Oracle公司为Java初学者和开发者提供的一个实用工具包,它包含了各种Java编程示例,旨在帮助用户更好地理解和掌握Java编程...
DevExpress是一款知名的软件开发工具提供商,其提供的DevExpress Demos是一系列展示其控件和框架功能的实例应用。在这款17.2版本的WinForm Demo中,开发者可以深入了解和学习DevExpress的Windows Forms平台上的组件...
Signal processing demos from Richards
3. 活动(Activity)与意图(Intent):ApiDemos演示了如何启动和管理活动,包括使用隐式和显式意图,以及处理活动生命周期。 4. 广播接收器(Broadcast Receiver):展示了如何注册和接收系统广播,以及自定义广播...
- **学习路径**:通过阅读和运行ApiDemos中的代码,开发者可以逐步了解Android框架,提升技能。 - **问题解决**:遇到实际开发中的问题,可以参考ApiDemos中的类似实现,或者通过搜索源码中的关键词找到解决方案。...
"Android Demos"是一个集合了各种Android开发示例的应用程序,它包含了丰富的代码实例,旨在帮助开发者更好地理解和学习Android平台的各种功能和API的使用。这个压缩包中的"ApiDemos"很可能是一个官方或非官方的实现...
本资源“Android开发入门与实例 Demos”旨在帮助初学者快速掌握Android应用开发的基础知识和实战技巧。 首先,让我们了解Android开发的基本流程。Android应用主要由Java或Kotlin语言编写,使用Android Studio作为...
此外,`README.md`文件是项目的基本说明文档,包含了如何配置、启动和使用这些资源的详细步骤,对于初学者来说至关重要。`start_server.sh`和`gensdk.sh`是对应的Linux版本脚本,保证了在不同操作系统环境下的一致性...
安卓ApiDemos,作为一个开发者们耳熟能详的项目,它是Android SDK中一个重要的组成部分,它提供了丰富的API实例,旨在帮助开发者深入理解和掌握Android系统的各种功能和特性。这个项目涵盖了Android API的多个层次,...