three.js - 目标对象的轮廓效果
问题描述
我正在寻找一种设置对象轮廓的方法。
我使用的是“OutlineEffect”而不是“EffectComposer”(OutlinePass 等),因为当我使用效果器时,即使使用 FXAAShader、SSAA 着色器和 OutlinePass 也无法使用“深色”颜色,分辨率质量也很低。
在 OutlineEffect 上,它说:
/*
* 1. Traditional
*
* var effect = new THREE.OutlineEffect( renderer );
*
* function render() {
*
* effect.render( scene, camera );
*
* }
*/
当我使用它时,甚至天空盒都会得到轮廓。
var outlinePass;
function init()
{
...
outlinePass = new THREE.OutlineEffect(renderer);
...
}
function animate()
{
...
outlinePass.render(scene, camera);
...
}
问题是我不想让它在天空盒上画出轮廓。
所以我使用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)
我想要做的是,为选择的对象创建“黑色”轮廓,没有天空盒。
谢谢您的帮助!
解决方案
我创建了 2 个场景,一个用于Don't have outline,另一个用于Have outline。
让我们为没有轮廓对象创建子场景。
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);
.
不要忘记!您需要使用相机和场景来控制对象,其中添加、附加了对象。
(例如悬停事件,单击事件,您需要对包含对象的场景进行光线投射。)
推荐阅读
- c# - 通过在视图上使用表发布值
- java - 检查 Jira 中是否存在问题列表
- java - 将 OkHttp 自定义拦截器添加到 Feign 客户端
- php - 使用 PHP 和 MSSQL 准备好的语句
- azure - 如何通过 Azure Function Apps 中的代码直接获取 Azure Function URL?
- python - 尝试在二进制分类上训练 SGDClassifier 时出现位置参数错误
- dart - 避免 BLoC 和 RxDart 中的重复
- typescript - 打字稿“树”对象定义
- javascript - Angular 5 视图子参考在 Safari 中不起作用(v 11.1)
- c++ - 带有通过引用传递的向量的尾递归