PhiloGL学习(2)——骚年,让我们荡起双桨
前言
上一篇文章中简单介绍了PhiloGL框架如何上手、GLSL语言以及简单的绘制一个方块(见PhiloGL学习(1)——场景创建及二维方块加载)。本文很简单,我们一起来让这个方块动起来。
一、 原理分析
以上一篇文章为基础,其中的html部分不需要修改,js部分仅做简单修改。本文主要操作的是camera。
想让一个物体动起来与现实情况一致,要么是调整自身姿态要么是调整自身位置。调整姿态是为旋转,调整位置是为移动,在PhiloGL中即为调整对象的position或者rotation。当然还有一种情况是你绕着一个物体转或者你冲着物体移动,这就牵涉到相对运动了,任何东西你只要深入思考一下就能上升到哲学问题。
骚年,有了思路就干起来吧!
二、 实现动画
2.1 创建对象
上一篇文章中我们采用为各种变量赋值的方式创建了一个方块,对于习惯面向对象编程的我来说比较喜欢将所有东西看成类,那么物体这个东西当然可以抽象成一个类。是的,PhiloGL为我们准备了这么一个类。我们就可以使用下述方式创建一个对象:
var square = new PhiloGL.O3D.Model({
vertices: [ 1, 1, 0,
-1, 1, 0,
1, -1, 0,
-1, -1, 0],
colors: [0.9, 0.9, 1, 1,
0.5, 0.5, 1, 1,
0.5, 0.5, 1, 1,
0.2, 0.5, 1, 1]
});
很简单,为Model对象传入vertices和colors即可,vertices即为上一篇文章中的aVertexPosition变量值,colors即为上一篇文章中的aVertexColor。
2.2 加载对象
理解了对象就是不同数据的集合之后一切就会变的简单,只需要将对象的属性替换上一篇文章中的值即可。
其实绘制一个对象主要是设置GLSL中的颜色和位置。那么主要就是进行setBuffers设置。
program.setBuffers({
'aVertexPosition': {
value: square.vertices,
size: 3
},
'aVertexColor': {
value: square.colors,
size: 4
}
});
这与上一篇文章中设置的setBuffers稍微不同,去除了attribute项,而是将内容直接写成了key,这样就相当于直接设置GLSL attribute变量中的此值,注意此种方法只能设置当前单一对象。
上一篇文章中使用camera.view.$translate(0, 0, -5)来设置物体的位置,有了上述对象的概念之后我们可以直接使用下述方式来设置对象的位置和旋转角度:
square.position.set(0, 0, -7);
square.rotation.set(0, 0, 0);
但是我们仍要将此对象的状态与Camera结合以进行正确的三维到二维的投影。
首先,将对象的状态与Camera的view结合:
var view = new PhiloGL.Mat4
view.mulMat42(camera.view, square.matrix);
此段代码完成的工作是将camera.view与square.matrix进行乘积操作,其实这与$translate操作基本一致。
然后将得到的view传给uMVMatrix参数即可:
program.setUniform('uMVMatrix', view);
program.setUniform('uPMatrix', camera.projection);
其他的与上一篇文章一致,将显示的代码封装成如下几个函数:
function setupElement(elem) {
elem.update();
view.mulMat42(camera.view, elem.matrix);
program.setBuffers({
'aVertexPosition': {
value: elem.vertices,
size: 3
},
'aVertexColor': {
value: elem.colors,
size: 4
}
});
program.setUniform('uMVMatrix', view);
program.setUniform('uPMatrix', camera.projection);
}
function drawScene() {
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
square.position.set(x, y, -7);
square.rotation.set(xRotation, yRotation, 0);
setupElement(square);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
}
其中elem.update()函数表示重新计算对象的状态,这与后面要介绍的动画关系比较密切。
2.3 骚年,让我们荡起双桨(动起来)
写到此,一切都已经很明了了,只需要加入类似time的循环操作改变square.position.set和square.rotation.set的值,这样即可让对象在场景中移动起来。
PhiloGL提供了PhiloGL.Fx.requestAnimationFrame(callback)函数来设置动画,callback为回调函数,查看此函数的源码不难看出,其调用了setTimeout函数,并且时间是1000/60,即每毫秒执行一次。
这样我们首先设置变量来记录对象的位置即姿态,每循环一次按照业务逻辑来改变x、y、z或旋转角度:
function animate() {
xRotation += 0.01;
yRotation -= 0.01;
if (x >= 3)
xSpeed = -0.01;
else if (x <= -3)
xSpeed = 0.01;
if (y >= 3)
ySpeed = -0.01;
else if (y <= -3)
ySpeed = 0.01;
x += xSpeed;
y += ySpeed;
}
然后设置循环,在循环中执行重绘对象及改变状态:
function tick() {
animate();
drawScene();
PhiloGL.Fx.requestAnimationFrame(tick);
}
onLoad中调用tick函数即可,这样我们的方块就会边旋转边移动。让我们荡起双桨~~~~~~
三、 总结
本文简单介绍了如何让我们的方块荡起来,下一篇文章介绍如何通过键盘和鼠标来控制我们的对象和场景。
PhiloGL学习(2)——骚年,让我们荡起双桨的更多相关文章
- PhiloGL学习(5)——神说要有光,便有了光
前言 上一篇文章中介绍了如何创建三维对象及加载皮肤,本文为大家介绍如何为场景添加光源. 一. 原理分析 光在任何地方都是非常重要的,无论在哪里都说是要发光发热,光和热也是分不开的.光线分为点光源和线光 ...
- PhiloGL学习(1)——场景创建及方块欲露还羞出水面
前言 上一篇文章中介绍了我认识PhiloGL框架的机缘以及初步的探讨(见JS前端三维地球渲染--中国各城市航空路线展示),在此文中仅仅对此框架进行了简单介绍并初步介绍了一些该框架的知识.首先三维这个东 ...
- PhiloGL学习(4)——三维对象、加载皮肤
前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...
- PhiloGL学习(3)——程序员的法宝—键盘、鼠标
前言 上一篇文章中介绍了如何让对象动起来,本文介绍如何让场景响应我们的鼠标和键盘以控制场景的缩放及对象的转动和移动等. 一. 原理分析 有了上一篇文章的基础,我们已经知道了如何让场景和对象动起来.本文 ...
- PhiloGL学习(6)——深情奉献:快乐的一家
前言 话说上一篇文章结尾讲到这一篇要做一个地球自转以及月球公转的三维动画,提笔,不对,是提键盘开始写的时候脑海中突然出现了几年前春晚风靡的那首歌:蒙古族小丫头唱的快乐的一家.闲言莫提,进入正题. ...
- 辛巴学院-Unity-剑英陪你零基础学c#系列(二)顺序
这不是草稿 辛巴学院:正大光明的不务正业. 上一次的教程写出来之后,反馈还是挺多的,有很多都做了修改,也有一些让人崩溃,不得不说上几句.有些人有些很奇怪的地方,你写篇东西,被看了以后不说他感觉怎么 ...
- 屠龙之路_狭路相逢勇者胜_EighthDay
屠龙天团的少年们追着Alpha恶龙沿路留下的粪便,一路狂奔追到了福州大学生活区三十号楼4层活动室,空气中弥漫着恶龙的臭味!屠龙少年对恶龙的隐身遁迹之术心知肚明,于是点头示意,四下散开.各自拿出了电脑, ...
- 初识java这个小姑娘(一)
忽然想起这样一个场景:那时我还是小学三年级的一个小学生,上课的铃声响起,文艺委员起头,大家开始胡乱的开始唱歌,"让我们荡起双桨,小船儿推开波浪",歌声在一片稚气中慢慢停止.我们的语 ...
- Egret3D 研究报告(一)初试
了解的朋友应该知道我最近一直都在鼓吹webgl. 今天有一点时间,加了一个Egret3D的群,就开始了这个坑. 耳听为虚,眼见为实.让我们荡起双桨,一起去刷一下egret 打开姿势 至于以什么姿势打开 ...
随机推荐
- Java课程设计 猜数游戏个人博客
1.团队课程设计博客链接 http://www.cnblogs.com/tt1104/p/7064349.html 2.个人负责模块或任务说明 1.成绩排行榜算法的设计: 2.排行榜存放到文件中, 3 ...
- Core Java 简单谈谈HashSet
同学们在看这个问题的时候,我先提出者两个问题,然后大家带着问题看这个文章会理解的更好. HashSet为什么添加元素时不能添加重复元素? HashSet是否添加null元素? 打开源码, 我们看到如下 ...
- python 浅析模块
今天买了一本关于模块的书,说实话,模块真的太多了,小编许多也不知道,要是把模块全讲完,可能得出本书了,所以小编在自己有限的能力范围内在这里浅析一下自己的见解,同时讲讲几个常用的模块. 首先说一下对模块 ...
- 才趟过的一个坑,css造成的Validform表单提交按钮点击无效
最近入手的一个项目,在开发的过程中,遇到了一个以前没遇到过的问题,废了半天的功夫才弄懂原因,留下足迹,警醒后人,下面开始讲故事啦! 在一个昏天暗地的上午,我一个人照常坐在办公室安静的工作中!项目编码已 ...
- JSP第六篇【自定义标签之传统标签】
为什么要使用自定义标签? JSTL标签库只提供了简单的输出等功能,没有实现任何的HTML代码封装,并且某些复杂类型转换,或者逻辑处理的时候,JSTL标签库完成不了,需要自定义标签! 编写自定义标签的步 ...
- 编译安装Nginx到Linux
之前安装的H2O不知道为啥,总是崩溃,换Nginx了下载包:http://nginx.org/download/ 配置:./configure --prefix=/usr/local/nginx -- ...
- struts1.3学习
一.基本配置 参考博客 项目结构 web.xml <!-- struts配置 --> <servlet> <servlet-name>action</serv ...
- js Date() 浏览器兼容问题解决
一般 直接new Date() 是不会出现兼容性问题的,而 new Date(datetimeformatstring) 常常会出现浏览器兼容性问题,为什么,datetimeformatstring中 ...
- uva 10391
这个题,单纯做出来有很多种方法,但是时间限制3000ms,因此被TL了不知道多少次,关键还是找对最优解决方法,代码附上: #include<bits/stdc++.h> using nam ...
- 51nod 1393 0和1相等串 思路 : map存前缀和
题目: 思路:把'0'当成数字-1,'1'当成数字1,求前缀和,用map更新当前前缀和最早出现的位置.(用map而不用数组是因为可能会出现负数) 当前缀和的值之前出现过,比如i = 10时,sum = ...