Three.js+OBJ文件实现模型改变颜色
·
总结下最近新学知识结果!
首先我们需要先下载 Three.js + OBJLoader.js + OrbitControls.js 这三个库才能正常编写代码!
话不多说,直接上代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>three.js示例</title>
<style>
body {
margin: 0;
overflow: hidden;
}
</style>
</head>
<body>
<script src="../pip/three.min.js"></script> <!-- 引入Three.js库 -->
<script src="../pip/OBJLoader.js"></script> <!-- 引入OBJLoader.js -->
<script src="../pip/OrbitControls.js"></script> <!-- 引入OrbitControls.js -->
<script>
var scene = new THREE.Scene(); // 创建场景对象
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); // 创建透视相机对象
camera.position.set(0, 10, 10); // 设置相机位置
camera.lookAt(0, 0, 0); // 设置相机视点
camera.up.set(0, 1, 0); // 设置相机的上方向
var renderer = new THREE.WebGLRenderer(); // 创建WebGL渲染器对象
renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器大小
document.body.appendChild(renderer.domElement); // 将渲染器添加到DOM元素中
var ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 创建环境光对象
scene.add(ambientLight); // 将环境光添加到场景中
var pointLight = new THREE.PointLight(0xffffff, 0.5, 100); // 创建点光源对象
pointLight.position.set(0, 10, 10); // 设置点光源位置
scene.add(pointLight); // 将点光源添加到场景中
var loader = new THREE.OBJLoader(); // 创建OBJLoader对象
loader.load(
"../pip/fangjian1.obj", // 模型文件相对于当前目录的路径
function (object) {
object.traverse(function (child) {
if (child instanceof THREE.Mesh) {
child.geometry.computeVertexNormals();
}
});
scene.add(object); // 将加载的OBJ模型添加到场景中
object.position.z = -20; // 设置模型位置
},
function (xhr) {
console.log((xhr.loaded / xhr.total) * 100 + "% 已加载"); // 输出加载进度
},
function (error) {
console.log("发生错误"); // 输出错误信息
}
);
var controls = new THREE.OrbitControls(camera, renderer.domElement); // 创建OrbitControls控制器对象
controls.target.set(0, 0, 0); // 设置控制器的焦点位置
controls.update(); // 更新控制器
// 添加鼠标点击事件监听器
renderer.domElement.addEventListener('click', onCanvasClick, false);
var colorPicker; // 用于保存颜色选择器的元素
// 鼠标点击事件处理函数
function onCanvasClick(event) {
// 获取点击位置的屏幕坐标
var mouse = new THREE.Vector2();
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
// 创建射线投射器
var raycaster = new THREE.Raycaster();
raycaster.setFromCamera(mouse, camera);
// 计算射线与场景中的物体的相交情况
var intersects = raycaster.intersectObjects(scene.children, true);
// 如果有物体被点击到,则弹出颜色选择器
if (intersects.length > 0) {
var selectedObject = intersects[0].object;
// 关闭之前打开的颜色选择器
closeColorPicker();
// 创建颜色选择器
createColorPicker(event.clientX, event.clientY, selectedObject);
} else {
// 点击其他地方关闭颜色选择器
closeColorPicker();
}
}
// 创建颜色选择器函数
function createColorPicker(x, y, object) {
// 添加颜色选择器,并设置其位置为鼠标点击的位置
colorPicker = document.createElement('input');
colorPicker.type = 'color';
colorPicker.id = 'color-picker';
colorPicker.style.position = 'absolute';
colorPicker.style.left = x + 'px';
colorPicker.style.top = y + 'px';
document.body.appendChild(colorPicker);
// 添加关闭按钮,并设置其位置为颜色选择器旁边
var closeButton = document.createElement('button');
closeButton.innerText = '×';
closeButton.id = 'close-button';
closeButton.style.position = 'absolute';
closeButton.style.left = x + colorPicker.offsetWidth + 'px';
closeButton.style.top = y + 'px';
document.body.appendChild(closeButton);
// 添加颜色变化事件监听器,以实时更新选中的颜色
colorPicker.addEventListener('input', function () {
// 获取选择器选择的颜色
var selectedColor = colorPicker.value;
// 将颜色应用到选中的物体上
object.material.color.set(selectedColor);
}, false);
// 添加点击关闭按钮的事件监听器
closeButton.addEventListener('click', function () {
// 关闭颜色选择器
closeColorPicker();
}, false);
}
// 关闭颜色选择器函数
function closeColorPicker() {
if (colorPicker) {
// 移除颜色选择器和关闭按钮
document.body.removeChild(colorPicker);
document.body.removeChild(document.getElementById('close-button'));
colorPicker = null;
}
}
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera); // 渲染场景
}
animate(); // 开始执行动画
</script>
</body>
</html>
更多推荐
已为社区贡献1条内容
所有评论(0)