Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解

作者:专注前端30年 时间:2024-05-22 10:31:00 

前言

本文主要给大家介绍了关于Three.js利用orbit controls插件(轨道控制)控制模型交互动作的相关内容,这个效果相对于第八节的轨迹球插件使用上感觉要好,虽然轨迹球插件可以来回的滚动,但是容易分辨不清楚上下左右的关系,容易混乱,适合调试,而轨道控制插件orbit则适合客户使用,还不会产生混乱效果。下面讲一下使用。

(1)首先引入插件,文件地址在官方案例的examples/js/controls/OrbitControls.js。

(2)然后实例化函数,把相机和渲染器的dom传入,并设置相关设置。


//用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放
var controls;
function initControls() {

controls = new THREE.OrbitControls( camera, renderer.domElement );

// 如果使用animate方法时,将此函数删除
//controls.addEventListener( 'change', render );
// 使动画循环使用时阻尼或自转 意思是否有惯性
controls.enableDamping = true;
//动态阻尼系数 就是鼠标拖拽旋转灵敏度
//controls.dampingFactor = 0.25;
//是否可以缩放
controls.enableZoom = true;
//是否自动旋转
controls.autoRotate = true;
//设置相机距离原点的最远距离
controls.minDistance = 200;
//设置相机距离原点的最远距离
controls.maxDistance = 600;
//是否开启右键拖拽
controls.enablePan = true;
}

(3)最后,在animate函数内调用orbit的update()更新。


function animate() {
//更新控制器
controls.update();
render();

//更新性能插件
stats.update();
requestAnimationFrame(animate);
}

就实现了相关效果。

下面是全部案例代码:


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
html, body {
 margin: 0;
 height: 100%;
}

canvas {
 display: block;
}

</style>
</head>
<body onload="draw();">

</body>
<script src="build/three.js"></script>
<script src="examples/js/controls/OrbitControls.js"></script>
<script src="examples/js/libs/stats.min.js"></script>
<script>
var renderer;
function initRender() {
renderer = new THREE.WebGLRenderer({antialias:true});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
}

var camera;
function initCamera() {
camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 10000);
camera.position.set(0, 0, 400);
}

var scene;
function initScene() {
scene = new THREE.Scene();
}

var light;
function initLight() {
scene.add(new THREE.AmbientLight(0x404040));

light = new THREE.DirectionalLight(0xffffff);
light.position.set(1,1,1);
scene.add(light);
}

function initModel() {
var map = new THREE.TextureLoader().load("examples/textures/UV_Grid_Sm.jpg");
var material = new THREE.MeshLambertMaterial({map:map});

var cube = new THREE.Mesh(new THREE.BoxGeometry(100, 200, 100, 1, 1, 1), material);
scene.add(cube);
}

//初始化性能插件
var stats;
function initStats() {
stats = new Stats();
document.body.appendChild(stats.dom);
}

//用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放
var controls;
function initControls() {

controls = new THREE.OrbitControls( camera, renderer.domElement );

// 如果使用animate方法时,将此函数删除
//controls.addEventListener( 'change', render );
// 使动画循环使用时阻尼或自转 意思是否有惯性
controls.enableDamping = true;
//动态阻尼系数 就是鼠标拖拽旋转灵敏度
//controls.dampingFactor = 0.25;
//是否可以缩放
controls.enableZoom = true;
//是否自动旋转
controls.autoRotate = true;
//设置相机距离原点的最远距离
controls.minDistance = 200;
//设置相机距离原点的最远距离
controls.maxDistance = 600;
//是否开启右键拖拽
controls.enablePan = true;
}

function render() {
renderer.render( scene, camera );
}

//窗口变动触发的函数
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
render();
renderer.setSize( window.innerWidth, window.innerHeight );

}

function animate() {
//更新控制器
controls.update();
render();

//更新性能插件
stats.update();
requestAnimationFrame(animate);
}

function draw() {
initRender();
initScene();
initCamera();
initLight();
initModel();
initControls();
initStats();

animate();
window.onresize = onWindowResize;
}
</script>
</html>

来源:http://blog.csdn.net/qq_30100043/article/details/75042703

标签:orbit,controls,轨道控制
0
投稿

猜你喜欢

  • MySQL的查询计划中ken_len的值计算方法

    2024-01-24 13:32:49
  • 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法分享

    2024-01-16 17:28:39
  • 利用 python 对目录下的文件进行过滤删除

    2022-07-01 01:24:32
  • Variant总能找到与之相匹配的数据类型吗?

    2009-10-29 12:20:00
  • OpenCV实现相机标定

    2023-11-13 00:36:45
  • 利用Python2下载单张图片与爬取网页图片实例代码

    2023-06-25 00:57:22
  • python Pandas 读取txt表格的实例

    2023-12-05 01:23:48
  • 使用Python对微信好友进行数据分析

    2021-04-12 18:10:58
  • Python基础之函数基本用法与进阶详解

    2023-07-13 07:57:46
  • Python基于递归算法实现的走迷宫问题

    2023-08-25 03:55:05
  • Python中的True,False条件判断实例分析

    2023-09-30 07:34:24
  • 完美处理python与anaconda环境变量的冲突问题

    2023-01-11 07:37:31
  • python推导式的使用方法实例

    2021-03-13 09:38:25
  • [项目布局配置]Nosql与PythonWeb-Flask框架组合

    2022-07-08 19:55:40
  • mysql 超大数据/表管理技巧

    2024-01-16 22:14:05
  • Python机器学习应用之决策树分类实例详解

    2021-12-19 16:57:53
  • thinkPHP学习笔记之安装配置篇

    2023-09-27 18:32:03
  • SQL多表联合查询时如何采用字段模糊匹配

    2024-01-19 18:06:40
  • 通过FSO进行页面计数

    2008-11-27 16:02:00
  • python list.sort()根据多个关键字排序的方法实现

    2021-05-22 03:16:09
  • asp之家 网络编程 m.aspxhome.com