threejs effects -3 PeppersGhostEffect(佩珀的幽灵)

PeppersGhostEffect实现佩珀的幽灵效果

佩珀的幽灵是一种用于剧院,游乐园,博物馆,电视和音乐会的幻觉技巧。它以英国科学家约翰亨利佩珀(1821-1900)的名字命名,他在1862年的示威活动中推广了这种效果。
在threejs中,通过该效果变换,幽灵般的物体在场景中看起来淡入或淡出,或者场景中的物体神奇地变换成不同的物体。

①首先引用插件包,该js文件在threejs工程文件夹的example目录下的js/effects/可以找到

<script type="text/javascript" src="js/effects/PeppersGhostEffect.js" ></script>

②实例化PeppersGhostEffect对象,并传入参数,设置属性

			effect=new THREE.PeppersGhostEffect(renderer);
			effect.setSize(window.innerWidth,window.innerHeight);
			effect.cameraDistance=5;//设置效果的距离远近

③最后在循环渲染

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

效果例子查看地址

代码示例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>佩珀的幽灵</title>
		<script type="text/javascript" src="js/three.js" ></script>
		<script type="text/javascript" src="js/controls/OrbitControls.js" ></script>
		<script type="text/javascript" src="js/libs/stats.min.js" ></script>
		<script type="text/javascript" src="js/libs/dat.gui.min.js" ></script>
		<script type="text/javascript" src="js/WebGL.js" ></script>
		<script type="text/javascript" src="js/effects/PeppersGhostEffect.js" ></script>
		<style>
			body{
				padding: 0;
				margin: 0;
				overflow: hidden;
			}
		</style>
	</head>
	<body>
		<script>
			if(WEBGL.isWebGLAvailable()===false){alert("该浏览器不支持WebGL!");document.body.appendChild(WEBGL.getWebGLErrorMessage());}
			
			var scene,renderer,camera,controls,stats;	
			var effect;
			function init(){
				scene=new THREE.Scene();
				
				renderer=new THREE.WebGLRenderer({
					antialias:true,
				});
				renderer.setSize(window.innerWidth,window.innerHeight);
				renderer.setPixelRatio(window.devicePixelRatio);
				document.body.appendChild(renderer.domElement);
							
				camera=new THREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,1,100000);
				
				controls=new THREE.OrbitControls(camera,renderer.domElement);
				controls.enableDamping=true;
				controls.minDistance=0.1;
				controls.maxDistance=1000;
				
				stats=new Stats();
				document.body.appendChild(stats.domElement);
				
				scene.add(new THREE.AmbientLight(0xffffff));
							
				effect=new THREE.PeppersGhostEffect(renderer);
				effect.setSize(window.innerWidth,window.innerHeight);
				effect.cameraDistance=5;//设置效果物体的距离
			};
			
			var axes;
			var group=new THREE.Group();
			function initModel(){
				axes=new THREE.AxesHelper(30);
				axes.visible=false;
				scene.add(axes);
				
				var geometry=new THREE.BoxBufferGeometry(1,1,1);
				geometry=geometry.toNonIndexed();//确保每个三角形具有唯一的顶点
				var position=geometry.attributes.position;
				console.log(position);
				var colors=[];
				var color=new THREE.Color();//为多维数据集的每一侧生成不同的颜色
				for(var i=0;i<position.count;i+=6){
					color.setHex(Math.random()*0xffffff);
					//第一个面
					colors.push(color.r,color.g,color.b);
					colors.push(color.r,color.g,color.b);
					colors.push(color.r,color.g,color.b);
					//第二个面
					colors.push(color.r,color.g,color.b);
					colors.push(color.r,color.g,color.b);
					colors.push(color.r,color.g,color.b);
				}
				geometry.addAttribute("color",new THREE.Float32BufferAttribute(colors,3));
				var material=new THREE.MeshBasicMaterial({
					vertexColors:THREE.VertexColors
				});
				for(var i=0;i<10;i++){
					var cube=new THREE.Mesh(geometry,material);
					cube.position.x=Math.random()*2-1;
					cube.position.y=Math.random()*2-1;
					cube.position.z=Math.random()*2-1;
					var s=Math.random()+0.5;
					cube.scale.set(s,s,s);
					group.add(cube);
				}	
				scene.add(group);
			}
				
			var setting;	
			function initGui(){
				setting={
					axesVisible:false,
					isPeppersGhost:true,
					cameraDistance:5
				};
				var gui=new dat.GUI();
				gui.add(setting,"axesVisible").onChange(function(e){
					axes.visible=e;
				});
				gui.add(setting,"isPeppersGhost");
				gui.add(setting,"cameraDistance",1,100).step(1).onChange(function(e){
					effect.cameraDistance=e;
				});
			}
						
			function onWindowResize(){
				camera.aspect=window.innerWidth/window.innerHeight;
				camera.updateProjectionMatrix();
				renderer.setSize(window.innerWidth,window.innerHeight);
			}
			
			function render(){
				group.rotation.y+=0.01;
				
				if(setting.isPeppersGhost){
					effect.render(scene,camera);
				}else{
					renderer.render(scene,camera);
				}				
			}
			
			function animate(){
				render();
				stats.update();
				controls.update();				
				window.onresize=onWindowResize();
				requestAnimationFrame(animate);
			}
			
			function threeStart(){
				init();
				initModel();
				initGui();
				animate();
			}
			threeStart();
		</script>
	</body>
</html>
### 如何在 Mac 上安装 `llamafactory-cli` 工具 要在 Mac 上成功安装和配置 `llamafactory-cli`,可以遵循以下方法: #### 创建虚拟环境并安装必要依赖项 为了确保工具能够正常工作,建议创建一个独立的 Python 虚拟环境来管理依赖关系。以下是具体操作步骤: ```bash # 创建一个新的虚拟环境 python3 -m venv llama_env # 激活虚拟环境 source llama_env/bin/activate # 安装 Git 并克隆 LLaMA-Factory 仓库到本地 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory # 使用 pip 安装项目所需的依赖项 pip install -e ".[torch,metrics]" ``` 上述命令会完成项目的克隆以及所需库的安装过程[^3]。 #### 配置 `llamafactory-cli` 一旦基础环境搭建完毕,可以通过以下方式进一步配置 CLI 工具: ```bash # 训练模型的一个示例调用 llamafactory-cli train cust/train_llama3_lora_sft.yaml conda deactivate ``` 此部分展示了如何通过 YAML 文件指定训练参数,并启动训练流程[^1]。 #### 特定于 macOS 的注意事项 对于 macOS 用户来说,还需要额外注意一些特定事项以优化性能和支持硬件加速功能。例如,可利用 Apple Silicon 提供的支持 Metal Performance Shaders (MPS) 来提升计算效率。如果计划使用 MPS,则需确认 PyTorch 或其他框架已正确编译支持该特性[^4]。 另外,在某些情况下可能需要手动调整 CUDA 或 cuDNN 设置;不过由于目标平台为苹果设备而非 NVIDIA GPU 架构,因此通常无需涉及这些组件。 --- ### 总结 综上所述,要实现在 Mac 设备上的顺利部署,关键是先建立隔离良好的开发空间(即虚拟环境),接着依照官方指引获取源码与关联资源文件,最后依据实际需求执行对应脚本或指令集即可达成目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值