THREE.Sprite详解

  • 问题背景
    • 1.sprite_vert.glsl解析

问题背景

因为之前想修改sprite使得可以不面向屏幕,正常立起来和3D文字一样,对此研究了下THREE对这块的实现原理。

1.sprite_vert.glsl解析

uniform float rotation;
uniform vec2 center;//默认0.5,0.5
#include <common>
#include <uv_pars_vertex>
#include <fog_pars_vertex>
#include <logdepthbuf_pars_vertex>
#include <clipping_planes_pars_vertex>
void main() {vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 ); vec2 scale;// modelMatrix is matrixWorld//因为矩阵左上角到右下角是模型对象的scale控制参数//这里拿到模型视图矩阵里面的scale.xscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );//这里拿到模型视图矩阵里面的scale.yscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );#ifndef USE_SIZEATTENUATIONbool isPerspective = isPerspectiveMatrix( projectionMatrix );if ( isPerspective ) scale *= - mvPosition.z;#endif//计算得到sprite包括中心点,其他点的坐标(相对的),下面才计算才最终坐标//center默认传的是0.5,0.5// position坐标是下面的结构,一个半径0.5的正方形//var float32Array = new Float32Array( [//    - 0.5, - 0.5, 0, 0, 0,//    0.5, - 0.5, 0, 1, 0,//  0.5, 0.5, 0, 1, 1,//    - 0.5, 0.5, 0, 0, 1//] );vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;// 下面是利用传入的uniform float rotation进行旋转变换vec2 rotatedPosition;rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y; //默认rotation=0,坐标还是alignedPosition.xrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y; 默认是alignedPosition.ymvPosition.xy += rotatedPosition;//计算得到所有点的相机空间坐标gl_Position = projectionMatrix * mvPosition; //投影坐标系坐标
}

【THREE源码解析篇】THREE.Sprite详解相关推荐

  1. php get 返回源码,php源码 fsockopen获取网页内容实例详解

    PHP fsockopen函数说明: Open Internet or Unix domain socket connection(打开套接字链接) Initiates a socket connec ...

  2. UVM源码分析之factory机制详解

    前言 作者在学习了一段时间的UVM factory源码之后写下此文,旨在记录自己的学习成果,毕竟好记性不如烂笔头嘛,当然如果能帮助到对这部分有疑惑的同仁就更好了.作者是在笔记本电脑上的windows环 ...

  3. 【THREE源码解析篇】THREE.Matrix4源码详解

    THREE.Matrix4源码详解 THREE.Matrix set函数: copyPosition函数(重要) makeTranslation(得到平移矩阵) transpose(矩阵转置) set ...

  4. Android进阶——Small源码分析之启动流程详解

    前言 插件化现在已经是Android工程师必备的技能之一,只是学会怎么使用是不行的,所以蹭有时间研究一下Small的源码.对于插件化主要解决的问题是四大组件的加载和资源的加载,读懂所有Small源码需 ...

  5. Java API源码在哪里找_详解查看JAVA API及JAVA源码的方法

    在java的日常学习中,我们有时候会需要看java的api说明,或者是查看java的源码,使我们更好的了解java,接下来我就来说说如何查看java的api以及java源码 对于java的api,一般 ...

  6. Android内核开发:源码的版本与分支详解

    我想很多初学者或许跟我一样,看完Android源码下载相关的文章以后,就开始兴致勃勃地去下载Android源码了,但是下载完了源码后,有没有像我一样产生如下几个困惑呢? (1) Android版本有哪 ...

  7. FreeRTOS 之一 源码目录文件 及 移植详解

    写在前面 2018/1/15更新了文章中的部分错误. FreeRTOS源码为最新版的10.0.1.FreeRTOS 10包含两个重要的新功能:流缓冲区和消息缓冲区. 从10.0.0开始,FreeRTO ...

  8. linux设备驱动开发详解源码,linux设备驱动开发详解光盘源码.rar

    压缩包 : linux设备驱动开发详解光盘源码.rar 列表 19/busybox源代码/busybox-1.2.1.tar.bz2 19/MTD工具/mtd-utils-1.0.0.tar.gz 1 ...

  9. Android源码中的目录结构详解

    由于自己从事与底层开发,一开始对项目结构不是很清楚,然后就百度找到了源码结构,我觉得讲的很清楚.Android 2.1源码结构 |-- Makefile |-- bionic              ...

最新文章

  1. matlab为曲线下面积上色
  2. Project Tango 的一些应用
  3. orb-slam2 代码逻辑梳理
  4. linux screen -ls,Linux screen命令详解
  5. usb协议规范_USB连接标准接口简述发布
  6. 程序分身:根据不同程序名执行不同函数
  7. 快速计算Distinct Count
  8. 转-Android仿微信气泡聊天界面设计
  9. TensorFlow 实战(四)—— tensor 的认识
  10. 32核心板怎么样使用stlink_终极调试工具 EventRecorder 使用方法,各种 Link 通吃
  11. 4针串口线接法图_串口硬盘4针的小接口怎么样连接
  12. 子网划分的计算与可用主机数
  13. 从北京回来的年轻人,我该告诉你点什么? 1
  14. C++扫雷小游戏(附赠源代码)
  15. 《全网搜索》6.1版 - 更新内容及下载链接
  16. 关于“primordials is not defined”报错的解决办法 - 解决报错篇
  17. 超级无敌qmail安装大法,详尽之极
  18. <MySQL>表中添加和删除字段
  19. Three.js-灯光与阴影
  20. 2001年考研英语真题

热门文章

  1. ASIFT算法过程实现 --- 配置避坑指南
  2. cura切片软件闪退,添加打印机闪退,导入模型闪退
  3. 一行代码能实现什么丧心病狂的功能?
  4. Unity3d打地鼠
  5. 【老生谈算法】matlab实现细菌觅食算法(BFA)源码——粒子群算法
  6. CC00052.LBCHAC——|Selinux.V2|——|2台server|
  7. windows10系统,如何进行文件内容多关键字搜索
  8. 小米MIUI开发版应用闪退问题 Secure.ANDROID_ID must not be null
  9. 聊聊新股市盈率的那些事
  10. 姜小白的Python日记Day12 迭代器与内置函数