pythreejs:如何将剪裁的表面渲染为实体对象

Posted

技术标签:

【中文标题】pythreejs:如何将剪裁的表面渲染为实体对象【英文标题】:pythreejs: How to render clipped surfaces as solid objects 【发布时间】:2019-04-18 21:00:08 【问题描述】:

我想在 JupyterLab 中使用 pythreejs 而不是纯 javascript 来实现 https://***.com/a/37093210 中描述的内容。

我可以在 python 中以某种方式子类化 MeshPhongMaterial 以添加此更改吗?

我也很乐意走ShaderMaterial 路线(请参阅https://github.com/jupyter-widgets/pythreejs/blob/master/examples/Shaders.ipynb),如果我能理解如何使用vertexShaderfragmentShader,那么大致看起来像MeshStandarMaterialMeshPhongMaterial(我需要环境光和点光源以及DoubleSide 光支持)。

当然,欢迎任何其他能让我了解https://***.com/a/37093210 和pythreejs 中所描述内容的想法。

【问题讨论】:

【参考方案1】:

移植答案https://***.com/a/38186639中提到的SectionHelper非常容易

class SectionHelper(Mesh):
    def __init__(self, object, hexOrMaterial):
        if isinstance(hexOrMaterial, MeshBasicMaterial):
            material = hexOrMaterial
        else:
            color = hexOrMaterial
            material = MeshBasicMaterial(color=color, side="BackSide")

        super().__init__(object.geometry, material)

        self.matrix = object.matrixWorld
        self.matrixAutoUpdate = False

结果如预期的那样

from ipywidgets import Layout
material = MeshPhongMaterial(color = "green", side="DoubleSide", diffuse="red")

torus = Mesh(
    TorusKnotBufferGeometry(radius=20, tube=5, tubularSegments=64, radialSegments=64, p=2, q=3), 
    material=material
)

sec = SectionHelper(torus, "#ff00ff")

key_light = DirectionalLight(color='white', position=[3, 5, 1], intensity=0.5)

c = PerspectiveCamera(position=[0, 100, 100], up=[0, 1, 0], children=[key_light])

scene = Scene(children=[torus, sec, c, AmbientLight(color='#777777')], background=None)

renderer = Renderer(camera=c, 
                    scene=scene,
                    alpha=True,
                    clearOpacity=0,
                    controls=[OrbitControls(controlling=c)],
                    width=500, height=500)

renderer.localClippingEnabled = True;
display(renderer)

for i in range(-64, 64):
    renderer.clippingPlanes = [Plane((0,-1,0), i/2.0)]
    time.sleep(0.1)

clipped torusknot

【讨论】:

以上是关于pythreejs:如何将剪裁的表面渲染为实体对象的主要内容,如果未能解决你的问题,请参考以下文章

∑GL-透视投影矩阵的推导

∑GL-透视投影矩阵的推导

如何在OpenGL中的对象空间坐标中获得近剪裁平面坐标

被渲染的 OpenGL 顶点被剪裁

如何使用stencil buffer实现分层剪裁

如何剪裁非闭合几何体