3d弹弹球

2年前 (2022) 程序员胖胖胖虎阿
375 0 0

上文和读者聊了聊三维世界中的坐标系问题,本文想通过一个弹弹球的案例,再来和读者聊一聊物体移动问题。

本文是threejs系列的第三篇,阅读前面的文章有助于更好的理解本文:


1.一个简单的案例,理解threejs中几个基本概念
2.三维世界中的坐标系


绘制平面

使用threejs中提供的PlaneGeometry我们可以绘制一个在三维空间中无限延伸的二维平面,如下:

  
  
  
  1. var scene = new THREE.Scene();

  2. var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);

  3. var render = new THREE.WebGLRenderer({

  4.    antialias: true

  5. });

  6. render.setClearColor("#FFFFFF");

  7. render.setSize(window.innerWidth, window.innerHeight);

  8. document.body.appendChild(render.domElement);

  9. var axesHelper = new THREE.AxesHelper(5);

  10. scene.add(axesHelper);

  11. var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1);

  12. var planeMaterial = new THREE.MeshBasicMaterial({color: 0xcccccc});

  13. var plane = new THREE.Mesh(planeGeometry, planeMaterial);

  14. plane.rotation.x = -0.5 * Math.PI;

  15. plane.position.x = 15;

  16. plane.position.y = 0;

  17. plane.position.z = 0;

  18. scene.add(plane);

  19. camera.position.z = 30;

  20. camera.position.x = -30;

  21. camera.position.y = 20;

  22. camera.lookAt(0, 0, 0);

  23. function show() {

  24.    render.render(scene, camera);

  25. }

  26. show()

这段代码和前文的类似,唯一不同的是这里增加了PlaneGeometry,这是一个二维平面,这个平面默认是平行于屏幕的,构建它的四个参数分别表示平面x轴上的长度、y轴上的长度、以及x轴上的分段数、y轴上的分段数。由于这个平面默认平行于电脑平面,读者可以看不出三维效果,因此首先将这个平面绕x轴旋转180度(不旋转,看到的效果就是屏幕上一个灰色的长方形),同时修改相机的观察位置,最后绘制平面,结果如下:

3d弹弹球

注意坐标轴,绿色是y轴,蓝色是z轴,剩下一个红色是x轴(通过坐标轴也可以想象出相机的位置)。

绘制球

接下来,向屏幕中添加一个球,球体使用SphereGeometry来构建,如下:

  
  
  
  1. var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);

  2. var sphereMaterial = new THREE.MeshBasicMaterial({color: 0x7777ff, wireframe: true});

  3. var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);

  4. sphere.position.y = 4;

  5. sphere.position.x = 20;

  6. sphere.position.z = 2;

  7. scene.add(sphere);

构造球体时,4表示半径,后面两个20分别表示宽和高的分段数。默认情况下,球心在世界坐标的(0,0,0)位置,这样会导致半个球在plane下方,因此设置球的y轴坐标为4,这样整个球就都在plane之上了,绘制结果如下:

3d弹弹球

跳动的球

使球跳动起来的方式有很多种,这里通过修改球的x轴、y轴坐标来实现这一功能,如下:

  
  
  
  1. var step = 0;

  2. function show() {

  3.    step += 0.04;

  4.    sphere.position.x = 20 + (10 * (Math.cos(step)));

  5.    sphere.position.y = 2 + (10 * (Math.abs(Math.sin(step))));

  6.    requestAnimationFrame(show)

  7.    render.render(scene, camera);

  8. }

由于余弦函数的取值在[-1,1],因此,球的x轴将介于10到30之间,正弦函数取值虽然也是[-1,1],但是因为取了绝对值,所以球的y轴介于2到12之间,最终跳动效果如下:

3d弹弹球

好了,本文先介绍到这里,有问题欢迎留言讨论。

本文案例:https://github.com/lenve/threejsDemo


往期精彩回顾

Docker教程
Redis教程
SpringCloud教程
Git教程
MongoDB教程
SpringBoot+Vue前后端分离开源项目-微人事
SpringBoot+Vue前后端分离开源项目-V部落

3d弹弹球

本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年10月3日 上午11:32。
转载请注明:3d弹弹球 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...