【发布时间】:2020-04-27 02:00:07
【问题描述】:
我正在尝试制作一个简单的 3D 模型查看器。我从 3Drendering 示例开始,这是 kivy 示例之一。以下是我试过的测试代码。(Python 3.7, Kivy 1.11.1)
Python 代码:test_renderer.py
import kivy
kivy.require('1.11.1')
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from renderer import Renderer
from kivy.lang import Builder
#from kivy.properties import ObjectProperty
#from kivy.uix.label import Label
#from kivy.uix.button import Button
Builder.load_file('test_win.kv')
class Test_Win(BoxLayout):
pass
class Test_Renderer(App):
def build(self):
self.title = 'Test Renderer'
return Test_Win()
if __name__ == '__main__':
Test_Renderer().run()
和kv文件:test_win.kv
# File name: test_win.kv
#:kivy 1.11.1
<Test_Win>:
BoxLayout:
orientation: 'horizontal'
BoxLayout:
orientation: 'vertical'
Label:
text: 'Test Renderer'
Button:
text: 'Click'
Splitter:
Renderer:
3Drendering 示例中的其他文件(renderer.py、objloader.py、simple.glsl、monkey.obj)(main.py、objloader.py、simple.glsl、monkey.obj)除了名称更改外相同main.py到renderer.py,都和上面两个文件在同一个文件夹里。
这些文件可以在以下位置找到 https://kivy.org/doc/stable/examples/gen__3Drendering__main__py.html#
或在https://github.com/kivy/kivy/tree/master/examples/3Drendering 使用 3D 文件。
生成的屏幕是as follows
旋转头显示在布局和小部件的顶部。看起来显示画布是根的画布,而不是我想要的分割器布局。
我刚开始 kivy,不知道从哪里开始。谁能帮我找到解决办法?
【问题讨论】:
-
一个重要的提示是
Canvas(误导性名称)只是一个图形指令列表。您有责任调整三角形的位置和比例以将它们放置在您想要的位置。 -
感谢您的评论。是的,我明白这一点。但与其他小部件(包括布局)不同,Renderer 类的行为独立于布局。例如,当我将 Renderer: 替换为 Label: 时,它遵循我设置的布局。不知道如何将 Renderer 类的画布合并到布局中。
-
3D 渲染是使用
Canvas的Widget完成的。它可以是使用任何Widget的Canvas的圆顶。事实上,您在App中看到的所有内容都是通过Canvas完成的。Widgets出现在您期望的位置的唯一原因是,设计师精心设计了每个Widget的Canvas指令以实现这一目标。尝试在任何Canvas上使用Rectangle,并修改其pos和size。您将看到Rectanglepos仅与Widgetpos相关,如果您这样做的话。 -
我上述声明的一个例外是
RelativeLayout,其中所有位置都相对于Layout的位置。因此,您可能会考虑使用RelativeLayout作为渲染器的基础。但RelativeLayout的绘图Canvas仍然不限于它的区域。
标签: python canvas layout kivy rendering