前言

上一篇文章中简单介绍了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)——骚年,让我们荡起双桨的更多相关文章

  1. PhiloGL学习(5)——神说要有光,便有了光

    前言 上一篇文章中介绍了如何创建三维对象及加载皮肤,本文为大家介绍如何为场景添加光源. 一. 原理分析 光在任何地方都是非常重要的,无论在哪里都说是要发光发热,光和热也是分不开的.光线分为点光源和线光 ...

  2. PhiloGL学习(1)——场景创建及方块欲露还羞出水面

    前言 上一篇文章中介绍了我认识PhiloGL框架的机缘以及初步的探讨(见JS前端三维地球渲染--中国各城市航空路线展示),在此文中仅仅对此框架进行了简单介绍并初步介绍了一些该框架的知识.首先三维这个东 ...

  3. PhiloGL学习(4)——三维对象、加载皮肤

    前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...

  4. PhiloGL学习(3)——程序员的法宝—键盘、鼠标

    前言 上一篇文章中介绍了如何让对象动起来,本文介绍如何让场景响应我们的鼠标和键盘以控制场景的缩放及对象的转动和移动等. 一. 原理分析 有了上一篇文章的基础,我们已经知道了如何让场景和对象动起来.本文 ...

  5. PhiloGL学习(6)——深情奉献:快乐的一家

     前言 话说上一篇文章结尾讲到这一篇要做一个地球自转以及月球公转的三维动画,提笔,不对,是提键盘开始写的时候脑海中突然出现了几年前春晚风靡的那首歌:蒙古族小丫头唱的快乐的一家.闲言莫提,进入正题.   ...

  6. 辛巴学院-Unity-剑英陪你零基础学c#系列(二)顺序

    这不是草稿 辛巴学院:正大光明的不务正业.   上一次的教程写出来之后,反馈还是挺多的,有很多都做了修改,也有一些让人崩溃,不得不说上几句.有些人有些很奇怪的地方,你写篇东西,被看了以后不说他感觉怎么 ...

  7. 屠龙之路_狭路相逢勇者胜_EighthDay

    屠龙天团的少年们追着Alpha恶龙沿路留下的粪便,一路狂奔追到了福州大学生活区三十号楼4层活动室,空气中弥漫着恶龙的臭味!屠龙少年对恶龙的隐身遁迹之术心知肚明,于是点头示意,四下散开.各自拿出了电脑, ...

  8. 初识java这个小姑娘(一)

    忽然想起这样一个场景:那时我还是小学三年级的一个小学生,上课的铃声响起,文艺委员起头,大家开始胡乱的开始唱歌,"让我们荡起双桨,小船儿推开波浪",歌声在一片稚气中慢慢停止.我们的语 ...

  9. Egret3D 研究报告(一)初试

    了解的朋友应该知道我最近一直都在鼓吹webgl. 今天有一点时间,加了一个Egret3D的群,就开始了这个坑. 耳听为虚,眼见为实.让我们荡起双桨,一起去刷一下egret 打开姿势 至于以什么姿势打开 ...

随机推荐

  1. 201521123114 《Java程序设计》第13周学习总结

    1.本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu. ...

  2. 再起航,我的学习笔记之JavaScript设计模式22(访问者模式)

    访问者模式 概念介绍 访问者模式(Visitor): 针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法 解决低版本IE兼容性 我们来看下面这段代码,这段代码,我们封装了一个绑定 ...

  3. PHPStorm调试PHP代码~实际操作+mark~~

    因为wamp自己已经下载了xdebug,只要配置开启就行了. 1. 配置php.ini(有就打开注释,没有就加上) XDEBUG Extension[xdebug]zend_extension =&q ...

  4. 06jQuery-02-层级选择器

    因为DOM结构就是层级结构,所以我们经常要根据层级关系进行选择. 1.层级选择器 $('ancestor descendant'),选择祖先中的子孙,中间留空格: $('form[name=uploa ...

  5. 对Spring IOC的理解(转)

    Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理 ...

  6. 克隆虚拟机 virtualbox 修改 uuid

    cmd E:\Program Files\Oracle\VirtualBox>VBoxManage.exe internalcommands sethduuid "E:\Program ...

  7. c# 第一节课 一些简单的应用

    注册要钱 我没钱

  8. 1 Spring Cloud Eureka服务治理(下)

    注:此随笔为读书笔记.<Spring Cloud微服务实战> 上篇主要介绍了什么是微服务以及微服务治理的简单实现,如微服务注册中心的实现.微服务注册的实现.微服务的发现和消费的实现.微服务 ...

  9. [转]IOS开发中的CGFloat、CGPoint、CGSize和CGRect

    http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGGeometry/Reference ...

  10. EntityFramework 6.x多个上下文迁移实现分布式事务

    前言 自从项目上了.NET Core平台用上了EntityFramework Core就再没碰过EntityFramework 6.x版本,目前而言EntityFramework 6.x是用的最多,无 ...