`
wjlgryx
  • 浏览: 307085 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

O3D程序基本结构

阅读更多


创建一个O3D对象
设置全局变量初始化通用库
创建一个O3D包管理对象
创建一个渲染图
设置绘图上下文(包括投影矩阵和观察转化矩阵)
创建材质效果对象,加载shader 文件或内容,付给材质效果对象
创建材质对象和形状对象,设置材质 draw list(透明或不透明)设置材质对象其他参数
j加载一个矩阵变换(transforms)和形状对象(shapes)到转换图对象(transform graph).
为图元对象(primitives)创建一个draw elements.
设置渲染回调操作函数, 3D图形每渲染一次都会执行渲染回调函数。
<!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>
Hello Cube: Getting started with O3D
</title>

<!--连接O3D 的js文件-->
<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');

// javascript事件
// Run the init() function once the page has finished loading.
// Run the uninit() function when the page has is unloaded.
window.onload = init;
window.onunload = uninit;

// 创建全局变量
var g_o3d;
var g_math;
var g_client;
var g_pack;
var g_clock = 0;
var g_timeMult = 1;
var g_cubeTransform;
var g_finished = false; // for selenium testing


/**
* 渲染回调函数
* 每渲染一次形状的位置就变换一次.
* @param {o3d.RenderEvent} renderEvent The render event object that gives
* us the elapsed time since the last time a frame was rendered.
*/
function renderCallback(renderEvent) {
g_clock += renderEvent.elapsedTime * g_timeMult;
// Rotate the cube around the Y axis.
g_cubeTransform.identity();
g_cubeTransform.rotateY(2.0 * g_clock);
}


/**
* Creates the client area.
*/
function init() {
o3djs.util.makeClients(initStep2);
}

/**
* Initializes O3D, creates the cube and sets up the transform and
* render graphs.
* @param {Array} clientElements Array of o3d object elements.
*/
function initStep2(clientElements) {
// 初始化全局变量和库.
var o3dElement = clientElements[0];
g_client = o3dElement.client;
g_o3d = o3dElement.o3d;
g_math = o3djs.math;

// Initialize O3D sample libraries.
o3djs.base.init(o3dElement);

// 创建包对象,材质、纹理效果等对象都是由包创建、管理和销毁.
g_pack = g_client.createPack();

// 创建渲染图的视图窗口对象.
var viewInfo = o3djs.rendergraph.createBasicView(
g_pack,
g_client.root,
g_client.renderGraphRoot);

// 设置视图窗口的投影矩阵(平行投影-orthographic或透视投影-perspective).

viewInfo.drawContext.projection = g_math.matrix4.perspective(
g_math.degToRad(30), // 30 度视野角度.
g_client.width / g_client.height,//比例
1, // z轴近点剪切平面.
5000); // z轴远点剪切平面.

// 设置观察点的位置方向角度
// cube is located.
viewInfo.drawContext.view = g_math.matrix4.lookAt([0, 1, 5], // eye
[0, 0, 0], // target
[0, 1, 0]); // up

//创建效果对象
var redEffect = g_pack.createObject('Effect');

//加载shader内容
var shaderString = document.getElementById('effect').value;
redEffect.loadFromFXString(shaderString);

// 创建材质对象.
var redMaterial = g_pack.createObject('Material');

// 设置材质对象drawList的方式(透明-zOrderedDrawList或不透明-performanceDrawList).
redMaterial.drawList = viewInfo.performanceDrawList;

// 应用效果给材质对象,效果对象提交shader文件给3D硬件处理
redMaterial.effect = redEffect;

// 创建一个立方体,应用材质效果.
var cubeShape = o3djs.primitives.createCube(g_pack,redMaterial,1);

// 创建转换图节点,把立方体加入到转换节点
g_cubeTransform = g_pack.createObject('Transform');
g_cubeTransform.addShape(cubeShape);

//将转换节点加入到根节点下
g_cubeTransform.parent = g_client.root;

// 开始对立方体进行渲染
cubeShape.createDrawElements(g_pack, null);

// 执行渲染回调函数
g_client.setRenderCallback(renderCallback);

g_finished = true; // for selenium testing.
}

/**
* 清除所有对象.
*/
function uninit() {
if (g_client) {
g_client.cleanup();
}
}

</script>
</head>
<body>
<h1>Hello Cube</h1>
This example shows how to display a spinning red cube in O3D.
<br/>


<!-- Start of O3D plugin 必须以O3D开头-->
<div id="o3d" style="width: 600px; height: 600px;"></div>
<!-- End of O3D plugin -->

<!-- shader内容,告诉3D硬件,如何渲染的内容-->
<div style="display:none">
<!-- Start of effect -->
<textarea id="effect">
// 世界、视口、投影矩阵 ,这三个矩阵和顶点坐标矩阵计算,得出顶点的屏幕坐标
float4x4 worldViewProjection : WorldViewProjection;

// 顶点数据结构,
struct VertexShaderInput {
float4 position : POSITION;
};

//像素数据结构
struct PixelShaderInput {
float4 position : POSITION;
};

/**
* 此函数输入顶点的相关数据,返回给像素数据结构*/
PixelShaderInput vertexShaderFunction(VertexShaderInput input) {
PixelShaderInput output;

// 计算顶点位置=顶点坐标*世界坐标*视口坐标*投影坐标
output.position = mul(input.position, worldViewProjection);
return output;
}

/**
* 返回像素着色颜色,都是红色。.
*/
float4 pixelShaderFunction(PixelShaderInput input): COLOR {
return float4(1, 0, 0, 1); // Red.
}

//以下三行是必须的留的,不是注释,告诉3D硬件-顶点着色程序的入口点、像素着色程序的入口点
// #o3d VertexShaderEntryPoint vertexShaderFunction
// #o3d PixelShaderEntryPoint pixelShaderFunction
// #o3d MatrixLoadOrder RowMajor
</textarea>
<!-- End of effect -->
</div>
</body>
</html>
分享到:
评论

相关推荐

    O3D学习笔记[一]素材准备*.3ds转成*.o3dtgz

    O3D使用O3DTGZ作为其内部资源包格式,它是一个经过压缩的文件,包含了模型、纹理、脚本和其他资源,可以作为一个整体在程序中加载,减少了内存占用和加载时间。 转换3DS到O3DTGZ的过程通常涉及以下步骤: 1. **...

    谷歌O3D的javascript源码

    开发者需要熟悉这些API函数,如`o3d.Element`、`o3d.Model`、`o3d.Pack`等,以构建复杂的3D应用程序。 4. **3D数学**:理解向量、矩阵和变换在3D图形中的应用是必不可少的。O3D库使用这些数学概念来表示位置、旋转...

    CHX(x=0-4在Y-Al2O3(ll0D)表面吸附的密度泛函研究 (2007年)

    使用基于密度泛函理论(DFT)的Cast叩量子力学计算程序模块,对CHX(X=0-4)在Y-AI2O3(ll0D)表面吸附的位置,空间结构和能量进行了理论计算。计算结果表明.CHx=(x=0-3)与表面形成强的相互作用。CH3,CH2物种处于表面八面体...

    C代码优化方案,提高程序效率

    在打印函数`printf`中,使用基本类型如 `%c`, `%d`, `%x`, `%X`, `%u` 和 `%s`,减少使用 `%ld`, `%lu`, `%lx`, `%lX`(长整型)和 `%f`(浮点型),因为它们可能导致生成的代码量增加,执行速度降低。 3. **减少...

    程序升温还原法PPT学习教案.pptx

    程序升温还原法(Temperature Programmed Reduction,简称TPR)是一种广泛应用于催化剂表征的技术,尤其在催化剂的...通过精确控制实验参数和深入分析TPR曲线,可以揭示催化剂的结构信息,进而指导催化剂的设计和改进。

    C语言高效编程的四大绝招

    【C语言高效编程的四大绝招】是编程实践中提升代码性能的关键技巧,下面将详细...合理地使用编译器优化选项,如-O2或-O3,也能进一步提升程序性能。在进行性能优化时,应当先分析瓶颈,有针对性地优化,避免过度优化。

    Intel® 编译器10.x版本优化快速参考指南

    使用 Intel® Thread Profiler 可以帮助您理解线程应用程序的结构并最大化其性能。使用 Intel® Thread Checker 可以诊断线程错误、加速开发流程,从而加快面市速度。这两个线程工具都可以处理二进制替换和覆盖插入...

    orientedboundingbox 基于OBB包围盒的碰撞检测模型 opengl

    1. `main.cpp`:这是程序的主入口点,包含了程序的主要逻辑和流程控制,可能包含了创建OBB、设置其位置和旋转,以及执行碰撞检测的代码。 2. `GSMath.cpp`:数学库文件,可能包含了一些基础的数学函数,如向量运算...

    基于51单片机的酒精检测仪课程设计

    - **结构**:由微型Al2O3陶瓷管、SnO2敏感层、测量电极和加热器等组成。 - **工作原理**:通过加热回路和信号输出回路工作,输出电压范围为0-5V。 2. **A/D转换电路** - **ADC0809**:8位逐次逼近型A/D转换器,...

    C语言高效编程的四大绝招_免费.doc

    选择合适的数据结构和算法是提升程序效率的关键。例如,使用哈希表可以实现快速查找,二分搜索可以减少搜索时间,动态规划可以优化递归过程。理解各种数据结构和算法的时间复杂度和空间复杂度,根据具体问题灵活选择...

    深入解析C语言中的register关键字及其应用

    例如,GCC等编译器提供的`-O2`或`-O3`等优化选项就能有效地提高程序的执行效率。 ##### 5.2 可读性和维护性 过度使用`register`可能会降低代码的可读性和维护性。在大多数情况下,代码的清晰性和可维护性比微小的...

    使用 sdcc 编写51单片机.zip

    51单片机的I/O接口、A/D转换器、D/A转换器、液晶显示、键盘输入等都是实际项目中常见的硬件接口,需要结合硬件原理图进行程序设计。 最后,对于初学者来说,通过实践项目来学习是最有效的途径。可以尝试编写一个...

    C 高 效 编 程.doc

    5. **算法选择和数据结构**:选择合适的算法和数据结构对于程序性能至关重要。比如,使用哈希表可以实现快速查找,而二分查找可以提高有序列表的搜索效率。合理地设计数据结构,可以减少不必要的遍历和比较。 6. **...

    CCS软件优化PPT教案.pptx

    - 线性汇编语句的基本结构包括标签、操作码、操作数等,并且可以使用伪指令进行更复杂的控制,比如定义函数、定义变量等。 - 线性汇编还涉及资源分配,例如特定类型的指令必须在特定的处理器单元执行,如LDH(读取...

    微软活动目录管理管理简明手册

    C在安装活动目录之前,要确保计算机满足基本系统要求:* Z& t: _9 N6 A1 c" C - B7 H( D6 e+ q- W9 x(1)计算机运行Windows 2000 Server版本,且系统盘是NTFS分区。0 O0 F/ N" {4 M2 A* V6 X$ g; f/ Z9 g & t' m4 ...

    CloudPoint:点云特征识别

    MFC(Microsoft Foundation Classes)是微软提供的一个C++库,用于构建Windows应用程序,而ALT(可能是指某种特定的点云处理算法或库)在这里与MFC结合,帮助实现特征识别功能。 点云特征识别通常包括以下几个关键...

    2017最新大数据架构师精英课程

    43_连接查询2 R: d" J9 J1 O3 D* B1 }2 u( {2 v 44_事务并发现象-脏读-幻读-不可重复读-隔离级别 45_隔离级别-并发现象展示-避免 46_表级锁-行级锁-forupdate 47_mysql数据源连接池 48_NIO" d% v1 P# ~3 S/ L 49_NIO...

    河北省石家庄市正定中学2015届高三理综1月月考试卷

    A选项正确,因为细胞凋亡是受基因控制的程序性死亡,可以由免疫系统中的效应T细胞诱导;B选项错误,因为细胞凋亡受到环境因素的影响;C选项正确,衰老细胞的染色质收缩会影响DNA复制和转录;D选项正确,即使是年轻的...

    Python设计模式编程中解释器模式的简单程序示例分享

    ### Python设计模式编程中解释器模式的简单程序示例 #### 概述 解释器模式是一种行为型设计模式,主要用于处理定义良好的语法或语言结构。它通过构建一系列类来解析和执行这些语言中的语句。在本文中,我们将探讨...

Global site tag (gtag.js) - Google Analytics