【发布时间】:2020-05-04 07:27:00
【问题描述】:
使用动画蒙皮网格获得轮廓效果的最佳方法是什么?
模型以特定姿势暂停的示例:https://jsfiddle.net/Eketol/uev9o0qp/
composer = new THREE.EffectComposer( renderer );
renderPass = new THREE.RenderPass(scene, camera);
renderPass.setSize(window.innerWidth, window.innerHeight);
composer.addPass(renderPass);
outlinePass = new THREE.OutlinePass( new THREE.Vector2( this.viewWidth, this.viewHeight ), scene, camera );
outlinePass.visibleEdgeColor.set( 0xff0000 );
outlinePass.hiddenEdgeColor.set( 0xffff00 );
outlinePass.edgeGlow = 0;
outlinePass.edgeThickness = 0.3; // Default is 1.
outlinePass.edgeStrength = 3; // Default is 3.
outlinePass.setSize(window.innerWidth, window.innerHeight);
composer.addPass(outlinePass);
另一个动画模型示例:https://jsfiddle.net/Eketol/4xcd365w/
据我了解,这是由于在显卡中进行了转换,因此代码没有顶点位置的引用。 这个问题也会影响到光线投射器。
我已经阅读了多次尝试和实验。其中一些使用发光材质,另一些使用具有多个渲染通道的两个甚至三个网格实例来完成轮廓(例如:http://jsfiddle.net/Nv7Up/)。
使用发光材料的缺点:
- 轮廓粗细会随着相机距离的变化而变化。
- 如果所选对象前面有另一个对象,则轮廓可能不会完全可见。
- 具有多个网格的对象可能看起来有点奇怪(尽管我可以接受)。
使用多个网格的缺点:
- 对于具有低多边形的简单对象可能没问题,但对于具有多个网格的自定义对象来说是地狱?例如:一支带有随机配件(如剑、盾等)的士兵。不确定使用自定义属性克隆每个蒙皮对象会有多复杂或性能成本。
- 不是使用多个网格,而是使用原始网格并在辅助场景中渲染它以获得蒙版或轮廓不是更容易吗?
问题:
- 是否可以使当前的 ThreeJS Outline 效果与动画 SkinnedMesh 一起正常工作?
- 如果转换后的顶点信息在显卡上,轮廓着色器是否可以 直接从中获取顶点信息或渲染图像?
- 如果上述方法不可行,是否有一种方法可以将 SkinnedMesh 变换应用于顶点,以便着色器具有正确的姿势信息?
【问题讨论】:
-
你所理解的并不是它实际上是如何工作的。
OutlinePass.prepareMaskMaterial用于渲染OutlinePass.selectedObjects,这种材质非常基础,因此不支持骨骼动画。当然可以使用骨骼动画和任何你想要的效果来获得这种效果,尽管可能没有实现,我怀疑这里有人会为你实现它。
标签: three.js outline post-processing