Three.js 对目标对象的轮廓效果
我正在寻找一种为对象设置轮廓的方法 我使用“OutlineEffect”而不是“EffectComposer”(OutlinePass等),因为当我使用effect composer时,分辨率质量很低,即使使用FXAAShader、SSAA着色器和OutlinePass也不能使用“深色” 关于OutlineEffect,它说:Three.js 对目标对象的轮廓效果,three.js,Three.js,我正在寻找一种为对象设置轮廓的方法 我使用“OutlineEffect”而不是“EffectComposer”(OutlinePass等),因为当我使用effect composer时,分辨率质量很低,即使使用FXAAShader、SSAA着色器和OutlinePass也不能使用“深色” 关于OutlineEffect,它说: /* * 1. Traditional * * var effect = new THREE.OutlineEffect( renderer ); * * fu
/*
* 1. Traditional
*
* var effect = new THREE.OutlineEffect( renderer );
*
* function render() {
*
* effect.render( scene, camera );
*
* }
*/
当我使用它时,甚至skybox都会得到轮廓
var outlinePass;
function init()
{
...
outlinePass = new THREE.OutlineEffect(renderer);
...
}
function animate()
{
...
outlinePass.render(scene, camera);
...
}
问题是我不想让它在skybox上画出轮廓
所以我使用了effect.setRenderTarget(objects)
outlinePass=new THREE.OutlineEffect(renderer)的底线代码>,出现错误:
three.js:18819 Uncaught TypeError: Invalid value used as weak map key
at WeakMap.set (<anonymous>)
at Object.get (three.js:18819)
at WebGLTextures.setupRenderTarget (three.js:22177)
at WebGLRenderer.setRenderTarget (three.js:25956)
at THREE.OutlineEffect.setRenderTarget (OutlineEffect.js:563)
three.js:18819未捕获类型错误:用作弱映射键的值无效
在WeakMap.set()处
在Object.get(three.js:18819)
在WebGLTextures.setupRenderTarget(three.js:22177)
在WebGLRenderer.setRenderTarget(three.js:25956)
位于3.OutlineEffect.setRenderTarget(OutlineEffect.js:563)
我想做的是,为选定对象创建“黑色”轮廓,而不使用skybox
谢谢你的帮助 我创建了两个场景,一个用于没有轮廓,另一个用于有轮廓 让我们为没有轮廓的对象创建子场景
skyBox = {
scene: new THREE.Scene(),
camera: new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 20000 )
//camera has same properties with main camera.
};
现在,不应该有轮廓的对象应该添加到skyBox.scene
,而skyBox.camera
将显示它们
对于对象,我需要添加如下对象:
skyBox.scene.add(object);
我从主摄像机复制了副摄像机的附加控制(如轨道控制等),所以我觉得只有“1”摄像机
所以现在,我需要让副摄像机和主摄像机有相同的条件
//controls for camera control; e.g. orbit control.
controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.addEventListener('change', camRender2 ); // for controls2
...
controls2 = new THREE.OrbitControls( skyBox.camera, renderer.domElement );
controls2.addEventListener('change', camRender ); // for control
... // other condition for your own controls.
现在,设置完成了。我只需要添加OutlineEffect
outlineEffect = new THREE.OutlineEffect(renderer);
现在,我只需要渲染它
...
renderer.autoClear = false; // If miss it, only main camera will render.
...
function render()
{
//let sub camerafollow the main camera.
skyBox.camera.quaternion = camera.quaternion;
outlineEffect.render(scene, camera); //render for outline scene.
renderer.render(skyBox.scene, skyBox.camera); //render for without outline scene.
}
添加轮廓对象,只需scene.add(object)代码>
别忘了!您需要使用相机和场景来控制添加、附着对象的对象。
(与“悬停事件”类似,单击“事件”,即需要对包含对象的场景进行光线投射的内容。)