Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Kivy中更改3D网格的颜色?_Python_3d_Kivy - Fatal编程技术网

Python 如何在Kivy中更改3D网格的颜色?

Python 如何在Kivy中更改3D网格的颜色?,python,3d,kivy,Python,3d,Kivy,我想使用Kivy渲染3D网格,我可以平移、旋转和更改它们的颜色。我设法简化/编辑,现在我有了这段代码,它只渲染了一个可旋转的红色正方形: from kivy.app import App from kivy.uix.widget import Widget from kivy.core.window import Window from kivy.resources import resource_find from kivy.graphics.transformation import Mat

我想使用Kivy渲染3D网格,我可以平移、旋转和更改它们的颜色。我设法简化/编辑,现在我有了这段代码,它只渲染了一个可旋转的红色正方形:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.resources import resource_find
from kivy.graphics.transformation import Matrix
from kivy.graphics import *

class Renderer(Widget):
    def __init__(self, **kw):
        self.vertices = [[ -1,-1, 0,
                            1,-1, 0,
                            1, 1,-0,
                           -1, 1, 0]]

        kw['shader_file'] = 'shaders.glsl'
        self.canvas = RenderContext(compute_normal_mat=True)
        shader_file = kw.pop('shader_file')
        self.canvas.shader.source = resource_find(shader_file)

        with self.canvas:
            Translate(0, 0, -4.5)
            self.rot = Rotate(0, 1, 1, 1)
            ChangeState(Kd=(1.0, 0.0, 0.0),
                        Ka=(1.0, 0.0, 0.0),
                        Ks=(.3, .3, .3),
                        Tr=1.,
                        Ns=1.,
                        intensity=1.)
            for i in xrange(len(self.vertices)):
                Mesh(   vertices=self.vertices[i],
                        indices=[0, 1, 2, 3, 0, 2],
                        fmt=[('v_pos', 3, 'float')],
                        mode='triangles')

        asp = float(Window.width) / Window.height / 2.0
        proj = Matrix().view_clip(-asp, asp, -0.5, 0.5, 1, 100, 1)
        self.canvas['projection_mat'] = proj

        Window.request_keyboard(None, self).bind(on_key_down = self.on_keyboard_down)

    def on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == "left": self.rot.angle -= 10
        elif keycode[1] == "right": self.rot.angle += 10

class MyApp(App):
     def build(self):
         return Renderer()

if __name__ == '__main__':
     MyApp().run()
注意:我使用了Github上Rubik的立方体项目中的
shaders.glsl


使用同样的原理,我可以翻译或缩放它,但我还没有弄明白如何改变它的颜色。唯一有效的方法基本上是清洁画布并再次渲染,但我相信还有更好的方法。

有人能帮我吗?

您可以通过RenderContext
\uuuuuu setitem\uuuuuuu
将统一变量传递给着色器。在这种情况下,颜色(固有和照明)通过Kd和Ka变量,因此您可以执行以下操作:

self.canvas['Kd'] = [0., 1., 0.]
self.canvas['Ka'] = [0., 1., 0.]
这会让一切都变成绿色


您(当然)可以对着色器中的任何其他均匀变量执行类似操作。

我可以再问一个问题吗?用这个,我只能有一个画布的颜色,不是吗?当然,我可以使用更多画布,但这会导致一个问题,例如透视(另一个对象可能取决于在更近的对象前面渲染的添加时间)。这些变量是统一变量,在着色器中一次只能有一个值。听起来您想传递和使用顶点属性,每个顶点的属性可能不同。是的,但是如何访问/使用这些顶点属性?