对WebGL开发有用的重要三角公式和概念的摘要(Three.js)
翻译自: https://ics.media/entry/15321/
对WebGL开发有用的重要三角公式和概念的摘要(Three.js)
我经常听到三角函数对于创建3D内容至关重要。我很惊讶,因为几乎没有在网站创建中使用三角函数的情况,但是当我学习WebGL时,我意识到很多情况下在3D中使用三角函数。因此,在本文中,我们总结了3D内容制作中经常使用的基本公式和概念。
我这次解释的内容很简单,但是这个公式是制作游戏和数据可视化的基础。根据您在高中数学中学到的知识,我们对其进行了编译,以便您可以通过三个示例进行学习。解释使用流行的WebGL库之一“ Three.js ”。
1.应用-圆周移动
根据公式定义:
所以:
class App {animate() {requestAnimationFrame(this.animate);...degree += 5;// 角度转为弧度const rad = degree * Math.PI / 180;// X座標 = 半径 x Cosθconst x = radius * Math.cos(rad);// Y座標 = 半径 x Sinθconst y = radius * Math.sin(rad);sphere.position.set(x, y, 0);}
}
做一个圆周移动的例子。 代码:step1-圆周运动
2、 经纬度知识
出处-经纬度计算
1) 经线(子午线)
- 连接南北两极的线叫经线或子午线
- 经线指示南北方向,所有的经线长度相等
- 国际上将通过
英国伦敦格林尼治天文台原址
的那条经线称为0°经线,也叫本初子午线。
1) 经度
- 英文 longitude 缩写 lng
- 以本初子午线的以东或以西的度数, 称为经度
- 范围: [-180,180]
2) 纬度
- 英文 latitude 缩写 lat
- 纬度是指某点与地球球心的连线和地球赤道面所成的线面角
- 范围: [-90,90]
3 应用-纬经度转换为三维坐标
如图,建立一个左手空间直角坐标系在赤道平面上, 因为WebGL是左手坐标系。X轴指向本初子午线,Y轴在赤道平面垂直X轴,Z轴指向北极。
已知经纬求3d坐标, A[θ1,θ2],经度θ2 ,纬度θ1。假设半径为单位1。 其中纬度θ1称为仰角,经度θ2称为方位角。
let x = cosθ1*cosθ2
let y = cosθ1*sinθ2
let z = sinθ1
positionA = (x, y, z)
下图中的公式计算球体上一个点的X,Y和Z坐标。做一个圆周移动的例子。 代码:step2-经纬度和3d坐标转化
function translateGeoCoords(latitude, longitude, radius) {// 仰角const phi = (latitude) * Math.PI / 180;// 方位角const theta = (longitude - 180) * Math.PI / 180;const x = -(radius) * Math.cos(phi) * Math.cos(theta);const y = (radius) * Math.sin(phi);const z = (radius) * Math.cos(phi) * Math.sin(theta);return new THREE.Vector3(x, y, z);}
有了上面的知识,来实现一个地球上描点。
4、四元数应用
参考资料:
四元数
四元数和球面线性插值
让我们画一条线,连接上一章中绘制的地球上的点。做一个圆周移动的例子。 代码:step3-连接点
使用四元数来获得两个球形点之间的轨迹坐标。四元数具有有关旋转轴和旋转角度的信息,并表示3D对象的方向。对于实现对象旋转很有用。
step1-获取旋转轴
创建生成四元数所需的轴。这次的轴是垂直于由从地球中心延伸的两个向量形成的平面的向量。在这种情况下,您可以通过找到两个向量(OA,OB)的叉积来获得垂直向量,因此cross()让我们使用该方法生成轴向量。
getOrbitPoints() {...// 获取两个向量的旋转轴const axis = startVec.clone().cross(endVec);// 单位化axis.normalize();
}
step2-获取旋转角
根据先前创建的轴找出旋转的角度。在这种情况下,从地心延伸的两个矢量之间 angleTo()的角度是旋转角度的极限值,因此可以使用该方法获得该角度。
getOrbitPoints() {...const angle = startVec.angleTo(endVec);
}
step3-得到旋转角
现在我们有了旋转轴和旋转角度,我们实际上生成了四元数。为了绘制一条平滑的线,请按顶点数一点一点地形成一个角度。
getOrbitPoints() {// segmentNum: 两点线的段数for (let i = 0; i < segmentNum; i++) {// 围绕轴生成四元数const q = new THREE.Quaternion();q.setFromAxisAngle(axis, angle / segmentNum * i);}
}
step4-得到顶点
在OA向量中反映由四元数创建的旋转信息。
getOrbitPoints() {for (let i = 0; i < segmentNum; i++) {...// 旋转向量const vertex = startVec.clone().applyQuaternion(q);vertices.push(vertex);}
小结
getOrbitPoints()现在可以从该函数获得连接两个点的轨迹的坐标。通过将轨迹坐标设置为直线的顶点,可以表示连接两个点的轨迹。
完整代码:
getOrbitPoints(startPos, endPos, segmentNum) {// 包含顶点的数组const vertices = [];const startVec = startPos.clone();const endVec = endPos.clone();// 两个向量的旋转轴const axis = startVec.clone().cross(endVec);// 轴向量到单位向量axis.normalize();// 由两个向量交织的角度const angle = startVec.angleTo(endVec);// 击中顶点以绘制连接两个点的弧for (let i = 0; i < segmentNum; i++) {// 围绕轴生成四元数const q = new THREE.Quaternion();q.setFromAxisAngle(axis, angle / segmentNum * i);// 旋转向量const vertex = startVec.clone().applyQuaternion(q);vertices.push(vertex);}// 添加终点vertices.push(endVec);return vertices;
}
<全文结束>
对WebGL开发有用的重要三角公式和概念的摘要(Three.js)相关推荐
- 分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
这张图每位程序员应该都深有感触. 人民心目中的程序员是这样的:坐在电脑面前噼里啪啦敲着键盘,运键如飞. 现实中程序员是这样的:编码5分钟,调试两小时. 今天我要给大家分享一个用WebGL开发的网站,感 ...
- 嵌入式开发有用的github上的开源代码库
嵌入式开发有用的github上的开源代码库 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011559046/article/details/80 ...
- 【组合数学】二项式定理与组合恒等式 ( 二项式定理 | 三个组合恒等式 递推式 | 递推式 1 | 递推式 2 | 递推式 3 帕斯卡/杨辉三角公式 | 组合分析方法 | 递推式组合恒等式特点 )
文章目录 一.二项式定理 二.组合恒等式 ( 递推式 1 ) 三.组合恒等式 ( 递推式 2 ) 四.组合恒等式 ( 递推式 3 ) 帕斯卡 / 杨辉三角公式 五.组合分析方法 六.递推式组合恒等式特 ...
- 三角公式以及常见关系
三角公式以及常见关系 文章目录 三角公式以及常见关系 和差角公式 积化和差公式 和差化积公式 二倍角公式与万能公式 半角公式 和差角公式 sin(x±y)=sinxcosy±cosxsiny ...
- Unity WebGL开发
教程来啦 一.WebGL不能干的那些事 二.注意事项 1.播放声音 2.跨域 3.发布http or https? 4.包体大小 5.Odin 6.T序列化失败 三.参考资料 四.Build 主要步骤 ...
- 理解嵌入式开发中的一些硬件相关的概念
为什么80%的码农都做不了架构师?>>> 做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解.这样才能深入的研究下去.下面我们简单的介绍嵌入式开发 ...
- 图解Esp32/ESP8266进行组网开发所需了解的那些小概念
图解Esp32/ESP8266进行组网开发所需了解的那些小概念 图解日程生活中常见网络操作背后的小概念 前情提要 过程中涉及的进行组网开发所需的小概念 漫画展示 预告:一个基于ESP32和ESP826 ...
- 游戏开发的HelloWorld,快速入门,新手上路,使用CocosCreator+JS,flyBird(飞翔小鸟)
游戏开发的HelloWorld,快速入门,新手上路,使用CocosCreator+JS,flyBird(飞翔小鸟) 介绍 开发环境 游戏原理 文件结构 详细操作 全部代码 介绍 拓展什么的都没有,真正 ...
- 硬件开发设计 - 焊接电路板,介绍焊接概念,焊接步骤,常见错误,难点等
焊接是硬件开发的基本功,硬件开发中常见问题除了电路设计问题,最大的就是手工焊接质量问题,而设计之初,所有的样板基本都要手工去焊接,当然一些大公司会设有焊接岗位,开发人员不需要自己去焊接,焊接功底也应该 ...
最新文章
- OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
- 【笔记】An explainable deep machine vision framework for plant stress phenotyping
- mysql卸载后root还在_CentoOs7 Mysql卸载后重新安装缺少/root/.mysql_secret
- Oracle ——如何确定性能差的 SQL
- java for foreach 效率_Java中LinkedList的fori和foreach效率比较
- mongodb java 单例_Java单例MongoDB工具类
- 深度学习:优化方法——momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam
- CentOS7系统服务管理systemctl
- Linux 命令(71)—— ldconfig 命令
- 干货 | 【备考PMP】 鬼知道经历了什么,成功拿下5A成绩~
- VMware虚拟机三种网络连接模式详解
- android 网易新闻 登录界面,Android实现仿网易新闻主界面设计
- linux服务器之间文件传输scp
- msp430单片机c语言应用程序,MSP430单片机C语言应用程序设计实例精讲
- kong插件开发-完全版
- 解决模拟器不能上网问题
- 0.1元成本柿饼派实现红外控制空调了
- 彻底卸载 .NET 框架 -- .NET Framework Cleanup Tool
- 使用 Ansible 管理 MySQL 复制
- SQL中特殊符号的使用
热门文章
- awk、cut、sort和uniq
- Java基于opencv—矫正图像
- Looper 需要手动 quit,那主线程 Looper 呢?
- 趣小面,陆正耀的另一副底牌
- python学习------面向对象的程序设计
- android 流播放器开发,GitHub - youcoding98/FastVideo: 基于Android平台的移动流媒体播放器的开发...
- 小米MIx3 miui11国际版本地化
- LoRa Gateway 笔记 3.1.3 帮助程序 util_pkt_logger 进行 LoRa 空口抓包
- JD开放平台接口(获得JD商品详情, 按关键字搜索商品,按图搜索京东商品(拍立淘), 获得店铺的所有商品,获取推荐商品列表, 获取购买到的商品订单列表)
- Python代码:检查学号是否合法