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

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

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

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

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

【问题讨论】:

    标签: three.js pythreejs


    【解决方案1】:

    移植答案https://stackoverflow.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

    【讨论】:

      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 2018-10-13
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多