翻译自: 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)相关推荐

  1. 分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型

    这张图每位程序员应该都深有感触. 人民心目中的程序员是这样的:坐在电脑面前噼里啪啦敲着键盘,运键如飞. 现实中程序员是这样的:编码5分钟,调试两小时. 今天我要给大家分享一个用WebGL开发的网站,感 ...

  2. 嵌入式开发有用的github上的开源代码库

    嵌入式开发有用的github上的开源代码库 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011559046/article/details/80 ...

  3. 【组合数学】二项式定理与组合恒等式 ( 二项式定理 | 三个组合恒等式 递推式 | 递推式 1 | 递推式 2 | 递推式 3 帕斯卡/杨辉三角公式 | 组合分析方法 | 递推式组合恒等式特点 )

    文章目录 一.二项式定理 二.组合恒等式 ( 递推式 1 ) 三.组合恒等式 ( 递推式 2 ) 四.组合恒等式 ( 递推式 3 ) 帕斯卡 / 杨辉三角公式 五.组合分析方法 六.递推式组合恒等式特 ...

  4. 三角公式以及常见关系

    三角公式以及常见关系 文章目录 三角公式以及常见关系 和差角公式 积化和差公式 和差化积公式 二倍角公式与万能公式 半角公式 和差角公式 sin⁡(x±y)=sin⁡xcos⁡y±cos⁡xsin⁡y ...

  5. Unity WebGL开发

    教程来啦 一.WebGL不能干的那些事 二.注意事项 1.播放声音 2.跨域 3.发布http or https? 4.包体大小 5.Odin 6.T序列化失败 三.参考资料 四.Build 主要步骤 ...

  6. 理解嵌入式开发中的一些硬件相关的概念

    为什么80%的码农都做不了架构师?>>>    做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解.这样才能深入的研究下去.下面我们简单的介绍嵌入式开发 ...

  7. 图解Esp32/ESP8266进行组网开发所需了解的那些小概念

    图解Esp32/ESP8266进行组网开发所需了解的那些小概念 图解日程生活中常见网络操作背后的小概念 前情提要 过程中涉及的进行组网开发所需的小概念 漫画展示 预告:一个基于ESP32和ESP826 ...

  8. 游戏开发的HelloWorld,快速入门,新手上路,使用CocosCreator+JS,flyBird(飞翔小鸟)

    游戏开发的HelloWorld,快速入门,新手上路,使用CocosCreator+JS,flyBird(飞翔小鸟) 介绍 开发环境 游戏原理 文件结构 详细操作 全部代码 介绍 拓展什么的都没有,真正 ...

  9. 硬件开发设计 - 焊接电路板,介绍焊接概念,焊接步骤,常见错误,难点等

    焊接是硬件开发的基本功,硬件开发中常见问题除了电路设计问题,最大的就是手工焊接质量问题,而设计之初,所有的样板基本都要手工去焊接,当然一些大公司会设有焊接岗位,开发人员不需要自己去焊接,焊接功底也应该 ...

最新文章

  1. OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
  2. 【笔记】An explainable deep machine vision framework for plant stress phenotyping
  3. mysql卸载后root还在_CentoOs7 Mysql卸载后重新安装缺少/root/.mysql_secret
  4. Oracle ——如何确定性能差的 SQL
  5. java for foreach 效率_Java中LinkedList的fori和foreach效率比较
  6. mongodb java 单例_Java单例MongoDB工具类
  7. 深度学习:优化方法——momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam
  8. CentOS7系统服务管理systemctl
  9. Linux 命令(71)—— ldconfig 命令
  10. 干货 | 【备考PMP】 鬼知道经历了什么,成功拿下5A成绩~
  11. VMware虚拟机三种网络连接模式详解
  12. android 网易新闻 登录界面,Android实现仿网易新闻主界面设计
  13. linux服务器之间文件传输scp
  14. msp430单片机c语言应用程序,MSP430单片机C语言应用程序设计实例精讲
  15. kong插件开发-完全版
  16. 解决模拟器不能上网问题
  17. 0.1元成本柿饼派实现红外控制空调了
  18. 彻底卸载 .NET 框架 -- .NET Framework Cleanup Tool
  19. 使用 Ansible 管理 MySQL 复制
  20. SQL中特殊符号的使用

热门文章

  1. awk、cut、sort和uniq
  2. Java基于opencv—矫正图像
  3. Looper 需要手动 quit,那主线程 Looper 呢?
  4. 趣小面,陆正耀的另一副底牌
  5. python学习------面向对象的程序设计
  6. android 流播放器开发,GitHub - youcoding98/FastVideo: 基于Android平台的移动流媒体播放器的开发...
  7. 小米MIx3 miui11国际版本地化
  8. LoRa Gateway 笔记 3.1.3 帮助程序 util_pkt_logger 进行 LoRa 空口抓包
  9. JD开放平台接口(获得JD商品详情, 按关键字搜索商品,按图搜索京东商品(拍立淘), 获得店铺的所有商品,获取推荐商品列表, 获取购买到的商品订单列表)
  10. Python代码:检查学号是否合法