Python 如何在Kivy中更改3D网格的颜色?
我想使用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
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.]
这会让一切都变成绿色
您(当然)可以对着色器中的任何其他均匀变量执行类似操作。我可以再问一个问题吗?用这个,我只能有一个画布的颜色,不是吗?当然,我可以使用更多画布,但这会导致一个问题,例如透视(另一个对象可能取决于在更近的对象前面渲染的添加时间)。这些变量是统一变量,在着色器中一次只能有一个值。听起来您想传递和使用顶点属性,每个顶点的属性可能不同。是的,但是如何访问/使用这些顶点属性?