花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 163|回复: 76

three.js : 独立控制图形对象

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2025-5-14 12:40 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    以下代码,使用 cubes 数组变量保存立方体对象,每一个对象记为 { id: id, name: 'name', step: step },其中,id 指向所创建的立方体,name 指向立方体的名称,step 指向立方体运动歩幅。然后通过 three.js 射线类判断被点击的图形对象,若和 cubes 存储的 name 相一致,则驱动该图形对象的运动歩幅,从而达到每一个图形对象均可独立控制的目的。

    <script type="module">
    	import * as THREE from 'https://esm.sh/three'; // 导入three.js模块
    
    	// 初始化场景、相机、渲染器
    	const scene = new THREE.Scene;
    	const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
    	camera.position.set(0, 0, 5);
    	const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
    	renderer.setSize(window.innerWidth, window.innerHeight);
    	document.body.appendChild(renderer.domElement);
    
    	let cubes = [], intersects = []; // 立方体合集、几何体合集
    
    	// 正方体几何体
    	const geometry = new THREE.BoxGeometry(1, 1, 1);
    	geometry.rotateX(Math.PI / 3);
    	geometry.rotateY(Math.PI / 2);
    
    	// 创建两种标准材质 : 一种各面随机色,另一种金色
    	const material1 = Array.from({length: 6}, () => new THREE.MeshStandardMaterial({ color: 0xffffff * Math.random() }));
    	const material2 = new THREE.MeshStandardMaterial({ color: 0xffd700 });
    	const cube1 = new THREE.Mesh(geometry, material1);
    	const cube2 = new THREE.Mesh(geometry, material2);
    	cube1.position.y += 1;
    	cube2.position.y += -1;
    	cube1.name = 'cube1';
    	cube2.name = 'cube2';
    	cubes.push({ id: cube1, name: 'cube1', step: 0.01 }, { id: cube2, name: 'cube2', step: 0.01 });
    	scene.add(cube1, cube2);
    
    	// 环境光
    	const AmbientLight = new THREE.AmbientLight('yellow')
    	scene.add(AmbientLight)
    
    	// 自然光
    	const hemiLight = new THREE.HemisphereLight(0xffffff, 0x000000, 1)
    	hemiLight.position.set(0, 100, 0)
    	scene.add(hemiLight)
    
    	// 以下借助three射线类判断图形和设备指针的位置关系
    	let raycaster = new THREE.Raycaster(); // 实例化射线拾取模型
    	const pointer = new THREE.Vector2(); // 实例化二维向量点结构
    
    	// 判断函数 :检测指针是否在three绘制的图形上
    	const isMess = (event) => {
    		pointer.x = (event.clientX / window.innerWidth) * 2 - 1;
    		pointer.y = -(event.clientY / window.innerHeight) * 2 + 1;
    		raycaster.setFromCamera(pointer, camera);
    		intersects = raycaster.intersectObjects([cube1, cube2], true); // 参数true表示为不拾取图形对象的子对象
    		return intersects.length > 0;
    	}
    
    	// 动画 :根据 step 变量值驱动对象运动或不运动
    	const animate = () => {
    		cubes.forEach(cube => cube.id.rotation.y += cube.step);
    		renderer.render(scene, camera);
    		requestAnimationFrame(animate);
    	};
    
    	// 页面单击事件 :点击到立方体对象控制其 step 变量的值
    	document.onclick = (e) => {
    		if (!isMess(e)) return;
    		const name = intersects[0].object.name; // 被点击的几何体名称
    		cubes.forEach(cube => {
    			// 立方体名称若等于几何体名称
    			if (cube.name === name) {
    				cube.step = cube.step === 0 ? 0.01 : 0;
    			}
    		});
    	};
    
    	// 鼠标指针移入立方体对象时显示手形图标
    	document.onmousemove = (e) => {
    		document.body.style.cursor = isMess(e) ? 'pointer' : 'default';
    	};
    
    	window.onresize = () => renderer.setSize(window.innerWidth, window.innerHeight); // 适应窗口变化
    
    	animate(); // 执行动画函数
    </script>
    
    <!-- 预览页面CSS -->
    <style> body { margin: 0; background: linear-gradient(#eee, #333); } </style>
    

    评分

    参与人数 4威望 +140 金钱 +280 经验 +140 收起 理由
    红影 + 50 + 100 + 50 赞一个!
    花飞飞 + 30 + 60 + 30 很给力!
    杨帆 + 30 + 60 + 30 精彩帖子!
    梦江南 + 30 + 60 + 30 很给力!

    查看全部评分

  • TA的每日心情
    开心
    2025-12-14 08:25
  • 签到天数: 600 天

    [LV.9]以坛为家II

    379

    主题

    1万

    回帖

    3万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师花潮贵宾

    发表于 2025-5-14 15:34 | 显示全部楼层
    谢谢老师辛苦。我怎么点不动“运行代码”
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-12-15 13:49
  • 签到天数: 395 天

    [LV.9]以坛为家II

    305

    主题

    2698

    回帖

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2025-5-14 18:05 | 显示全部楼层
    分享精彩,恭喜老师又有新探索
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-5-14 19:31 | 显示全部楼层
    两个立方体在旋转。。这种亚光色真的好漂亮的。。

    我在研究标题:为何叫做独立控制图形对象。
    操作后发现,点击任何一个都可以单独停止,再击旋转。。
    也可以叫做独立控制几何体
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-5-14 19:40 | 显示全部楼层
    对环境光和自然光很感兴趣,
    试着换了一下,这跟PS里常用的渐变映射有点像。。。
    环境光渲染的相当自然,在保持原本颜色的基础上,加上环境光,很自然的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-5-14 19:47 | 显示全部楼层
    cubes 数组变量保存立方体对象,两个ID不同,名称不同。。步幅相同,当然也可以设为不同。。

    通过three.js 射线判断点击的是谁,这个也是个新名词。。。

    我们是看到成品,独立执行得相当完美~~
    想想要构思设想,再到尝试,最后实现,这个过程小白就是仰望的存在。。
    给白老师点一万个大赞
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-5-14 19:48 | 显示全部楼层
    上帝说要有光,于是今天就看到了光。。。真是让人欣喜。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2025-5-14 19:49 | 显示全部楼层
    梦江南 发表于 2025-5-14 15:34
    谢谢老师辛苦。我怎么点不动“运行代码”

    换个浏览器试一试,我点击正常的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 20:08 | 显示全部楼层
    杨帆 发表于 2025-5-14 18:05
    分享精彩,恭喜老师又有新探索

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 20:09 | 显示全部楼层
    梦江南 发表于 2025-5-14 15:34
    谢谢老师辛苦。我怎么点不动“运行代码”

    原因可能有两个:

    一,杂牌浏览器(使用规范浏览器);
    二,缓存太多(清除缓存即可);
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 20:10 | 显示全部楼层
    花飞飞 发表于 2025-5-14 19:48
    上帝说要有光,于是今天就看到了光。。。真是让人欣喜。。

    现在用的光源还是比较简单的光源
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 20:10 | 显示全部楼层
    花飞飞 发表于 2025-5-14 19:47
    cubes 数组变量保存立方体对象,两个ID不同,名称不同。。步幅相同,当然也可以设为不同。。

    通过thre ...

    谢一万
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 20:11 | 显示全部楼层
    花飞飞 发表于 2025-5-14 19:40
    对环境光和自然光很感兴趣,
    试着换了一下,这跟PS里常用的渐变映射有点像。。。
    环境光渲染的相当自然, ...

    光源是一门比较复杂的学问
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-5-14 21:05 | 显示全部楼层
    还真是独立控制的,而且停止后,再运行也是独立的呢
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-5-14 21:06 | 显示全部楼层
    这个有趣,想让哪个停,就能控制哪个
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 21:07 | 显示全部楼层
    红影 发表于 2025-5-14 21:06
    这个有趣,想让哪个停,就能控制哪个

    就是复杂得多
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 21:08 | 显示全部楼层
    红影 发表于 2025-5-14 21:05
    还真是独立控制的,而且停止后,再运行也是独立的呢

    每一个子对象有自己的速度变量(歩幅)
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-5-14 21:09 | 显示全部楼层
    “检测指针是否在three绘制的图形上”
    这个里面的判断方式没看懂。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-5-14 21:13 | 显示全部楼层
    红影 发表于 2025-5-14 21:09
    “检测指针是否在three绘制的图形上”
    这个里面的判断方式没看懂。

    而且不是特别准确,这是将就的方法。原理是将相机所拍到的图形的射线计算出二维平面的几何面,正常的时候大概准确,当图像旋转角度很大时,它就不那么精准了,你可以去看看牵引的原版
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-14 08:25
  • 签到天数: 600 天

    [LV.9]以坛为家II

    379

    主题

    1万

    回帖

    3万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师花潮贵宾

    发表于 2025-5-15 08:05 | 显示全部楼层
    花飞飞 发表于 2025-5-14 19:49
    换个浏览器试一试,我点击正常的。

    早上问好飞飞老师,我只有一个2345浏览器。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-16 01:46 , Processed in 0.081956 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表