🌓
搜索
 找回密码
 立即注册

Threejs 学习之旅(三)

塞上雪狼 2022-10-9 10:26:01 86850
PerspectiveCamera 透视相机

例:

  1. const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height,1,1000);
复制代码
  构造函数

  PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )

  fov — 摄像机视锥体垂直视野角度
aspect — 摄像机视锥体长宽比
near — 摄像机视锥体近端面
far — 摄像机视锥体远端面

这些参数一起定义了摄像机的viewing frustum(视锥体)
   正交相机(OrthographicCamera)

例:

  1. var camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );
  2. scene.add( camera );
复制代码
  构造器

  OrthographicCamera( left : Number, right : Number, top : Number, bottom : Number, near : Number, far : Number )

  left — 摄像机视锥体左侧面。
right — 摄像机视锥体右侧面。
top — 摄像机视锥体上侧面。
bottom — 摄像机视锥体下侧面。
near — 摄像机视锥体近端面。
far — 摄像机视锥体远端面。

这些参数一起定义了摄像机的viewing frustum(视锥体)。
   让相机跟随鼠标移动

   首先监听鼠标事件 window.addEventListener 中的 mousemove利用 这个方法我们可以得到当我们鼠标移动的时候XY 坐标
  1. let cursor={
  2.     x:0,
  3.     y:0
  4. }
  5. window.addEventListener('mousemove',function(event){
  6.   cursor.x=event.clientX/sizes.width-0.5      
  7. //按照 视口大小来渲染比例 -0.5是为了让其可以有正负值
  8.   cursor.y=-(event.clientY/sizes.height-0.5)
  9.   console.log(cursor)
  10. })
复制代码
 将XY带入 camera坐标中
  1. const tick=()=>{
  2.   camera.position.x=cursor.x*3;
  3.   camera.position.y=cursor.y*3;
  4.   camera.lookAt(new THREE.Vector3())   
  5.   renderer.render(scene, camera);
  6.   window.requestAnimationFrame(tick)
  7. }
  8. tick()
复制代码
利用正弦余弦定理来设置旋转大小的值
  1. const tick=()=>{
  2.   camera.position.x=Math.sin(cursor.x*Math.PI*2)*3;
  3.   camera.position.z=Math.cos(cursor.x*Math.PI*2)*3;
  4.   camera.position.y=cursor.y*5;
  5.   // camera.lookAt(new THREE.Vector3())
  6.   camera.lookAt(mesh.position)
  7.   renderer.render(scene, camera);
  8.   window.requestAnimationFrame(tick)
  9. }
  10. tick()
复制代码
效果:
225215zjikkxgqjcggj8iz.gif


  1. import "./style.css";import * as THREE from "three";import gsap from 'gsap'const scene = new THREE.Scene();const geometry = new THREE.BoxGeometry(1, 1, 1);const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });const mesh = new THREE.Mesh(geometry, material);scene.add(mesh);const sizes = {  width: 800,  height: 600,};let cursor={  x:0,  y:0}window.addEventListener('mousemove',function(event){  cursor.x=event.clientX/sizes.width-0.5  cursor.y=-(event.clientY/sizes.height-0.5)  console.log(cursor)})const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height);camera.position.z = 3;scene.add(camera);const canvas = document.querySelector("canvas.webgl");const renderer = new THREE.WebGLRenderer({  canvas,});renderer.setSize(sizes.width, sizes.height);// gsap.to(mesh.rotation,{duration:1,delay:1,y:2})const tick=()=>{
  2.   camera.position.x=Math.sin(cursor.x*Math.PI*2)*3;
  3.   camera.position.z=Math.cos(cursor.x*Math.PI*2)*3;
  4.   camera.position.y=cursor.y*5;
  5.   // camera.lookAt(new THREE.Vector3())
  6.   camera.lookAt(mesh.position)
  7.   renderer.render(scene, camera);
  8.   window.requestAnimationFrame(tick)
  9. }
  10. tick()
复制代码
 OrbitControls 轨道控制

   动态观察控件允许相机围绕目标动态观察。 要使用它,就像/examples目录中的所有文件一样,您必须将该文件单独包含在您的HTML中。
 
  Constructor OrbitControls( object : Camera, domElement : HTMLDOMElement ) object: (required) The camera to be controlled. The camera must not be a child of another object, unless that object is the scene itself. domElement: (optional) The HTML element used for event listeners. By default this is the whole document, however if you only want the controls to work over a specific element (e.g. the canvas) you can specify that here.
  翻译
构造函数 OrbitControls( object : Camera,domElement : HTMLDOMElement)
  @param | object必选)要控制的摄像机。摄像机不能是另一个对象的子对象,除非该对象是场景本身。
  @param | domElement可选)用于事件侦听器的HTML元素。默认情况下,这是整个文档,但是如果您只想控制特定的元素(例如画布),您可以在这里指定。
   在webpack 中引入示例:

  1. import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
  2. const controls =new OrbitControls( camera, renderer.domElement );
  3. //controls.update() must be called after any manual changes to the camera's transform
  4. controls.update();
复制代码
完整代码: 
  1. import "./style.css";
  2. import * as THREE from "three";
  3. import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
  4. import gsap from 'gsap'
  5. const scene = new THREE.Scene();
  6. const geometry = new THREE.BoxGeometry(1, 1, 1);
  7. const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
  8. const mesh = new THREE.Mesh(geometry, material);
  9. scene.add(mesh);
  10. const sizes = {
  11.   width: 800,
  12.   height: 600,
  13. };
  14. const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height);
  15. camera.position.z = 3;
  16. scene.add(camera);
  17. const canvas = document.querySelector("canvas.webgl");
  18. const renderer = new THREE.WebGLRenderer({
  19.   canvas,
  20. });
  21. renderer.setSize(sizes.width, sizes.height);
  22. var controls =new OrbitControls( camera, canvas );
  23. //controls.update() must be called after any manual changes to the camera's transform
  24. controls.update();
  25. // gsap.to(mesh.rotation,{duration:1,delay:1,y:2})
  26. const tick=()=>{
  27.   renderer.render(scene, camera);
  28.   window.requestAnimationFrame(tick)
  29. }
  30. tick()
复制代码
效果:
225216whna06n88ghjmta1.gif

阻尼(衰减) enableDamping
 


   Controls.enableDamping=true 
  
  .enableDamping : Boolean Set to true to enable damping (inertia), which can be used to give a sense of weight to the controls. Default is false. Note that if this is enabled, you must call .update () in your animation loop.
  。enableDamping:布尔值 设定为true以启用阻尼(惯性),这可用于给控件一种重量感。默认值为false。 请注意,如果启用了此选项,您必须调用。动画循环中的update()。
  1. const controls =new OrbitControls( camera, canvas );
  2. controls.enableDamping=true    //开启衰弱
  3. // gsap.to(mesh.rotation,{duration:1,delay:1,y:2})
  4. const tick=()=>{
  5.   controls.update();//每一帧都需要更新
  6.   renderer.render(scene, camera);
  7.   window.requestAnimationFrame(tick)
  8. }
  9. tick()
复制代码
重点每一帧都需要去更新 controls.update()
效果:
225217mv6si5q6zalzl123.gif

 最后推荐看一遍文档来熟悉其他API

three.js中文文档

来源:SketchUpBBS
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

扫一扫

随机推荐

最新主题

8 回复

学习了,谢谢分享、、、
锄禾日当午,发帖真辛苦。
帮帮顶顶!!
小手一抖,积分到手!
感谢分享!
帮你顶下哈!!
好帖,来顶下
相当不错,感谢无私分享精神!
高级模式
游客
返回顶部