Three.js 对目标对象的轮廓效果

Three.js 对目标对象的轮廓效果,three.js,Three.js,我正在寻找一种为对象设置轮廓的方法 我使用“OutlineEffect”而不是“EffectComposer”(OutlinePass等),因为当我使用effect composer时,分辨率质量很低,即使使用FXAAShader、SSAA着色器和OutlinePass也不能使用“深色” 关于OutlineEffect,它说: /* * 1. Traditional * * var effect = new THREE.OutlineEffect( renderer ); * * fu

我正在寻找一种为对象设置轮廓的方法

我使用“OutlineEffect”而不是“EffectComposer”(OutlinePass等),因为当我使用effect composer时,分辨率质量很低,即使使用FXAAShader、SSAA着色器和OutlinePass也不能使用“深色”

关于OutlineEffect,它说:

/*
 * 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)

别忘了!您需要使用相机和场景来控制添加、附着对象的对象。 (与“悬停事件”类似,单击“事件”,即需要对包含对象的场景进行光线投射的内容。)