vrFieldAccess
进行低级别字段访问教程 12:使用 vrFieldAccess
进行低级别字段访问视频涵盖以下内容:
基础知识(使用节点属性编辑器查找字段)和高级知识
如何访问某些较为复杂的字段,例如,一个字段容器(及其他,多个级别)或字段容器列表中的 fieldContainer
视频字幕:大家好,欢迎学习面向 VRED Pro 的 Python 脚本教程中的最后一个视频。我叫 Christopher,今天我将介绍如何使用 vrFieldAccess
API 在 VRED 的节点属性编辑器中读取和操纵字段。
通过菜单在 VRED 中打开节点属性编辑器时,您可以访问 VRED 用于任何类型节点的所有内部数据。例如,这可以是“场景图形”中可以包含的任何节点,也可以是材质节点、灯光节点,甚至场景板节点。例如,如果在节点属性编辑器中查看“场景图形”节点,则可以看到所有当前变换值,如平移、旋转或缩放。对于材质,节点属性编辑器显示所有颜色分量数据和纹理,如漫反射颜色或凹凸贴图。
通常,您不希望通过节点属性编辑器访问此信息,因为 VRED 已通过常规界面公开大多数此类数据。此外,在节点属性编辑器中编辑任意值也不安全,因此手动更改摄影机的透视矩阵可能并不可取。
但是,在某些情况下,它会变得很方便。例如,如果要使用 Python 动态创建材质,则设置漫反射颜色或其他参数的唯一方法是使用字段访问 API。另一个示例是,对于项目,我必须动态生成与传入视频流分辨率大小匹配的显示屏,实现此目的的唯一方法是通过字段访问 API 读取视频流的分辨率。
我们先来看一个简单的示例。我们要创建材质,并将其漫反射颜色设置为鲜红色。如果我们使用节点属性编辑器查看其他材质,可以看到 diffuseColor
字段是导致此情况的原因。将鼠标光标移动到右侧的值时,我们还可以看到 VRED 内部使用的数据类型。在这种情况下,它是一个包含三个分量的矢量。
为此,我们首先使用 fields
方法访问节点的字段,然后使用设置方法设置值。在这种情况下,我们使用 getVector3f
方法将 RGB 值写入字段 diffuseColor
。执行脚本并重新加载“材质编辑器”时,我们可以找到漫反射颜色设置为鲜红色的新材质。
好,我们来更深入地探讨。在节点属性编辑器中访问第一级非常简单。但是,我们如何在字段访问图形中访问更深入的字段?假设我们要读取材质凹凸贴图纹理的纹理分辨率。为此,我们首先必须访问包含所需字段的每个字段容器。在本例中,分别是“colorComponentData”、“bumpComponent”和“image”。
首先,我们获取材质及其字段。然后,从一个字段容器到下一个,直到到达实际包含我们数据的字段容器。这可以通过使用 getFieldContainer
方法并将返回值用作 vrFieldAccess
类构造函数中的参数来完成。当我们到达最后一个字段容器“bumpImageComponent”时,则可以访问分辨率的字段。在本例中,分辨率为 1024 x 1024。
在大多数情况下,您只能读取和操纵节点中已存在的字段。但是,在某种程度上,您还可以将任意数据添加到节点。例如,在开发用于数据准备的复杂插件时,这会非常有用。那么我们如何做到这一点呢?
下一个脚本显示了如何使用附件节点“ValuePair”向其写入字符串数据列表,以及如何使用“key”和“value”字段存储数据。我们将键值对分为两个列表,将它们存储在附件中,以便稍后进行检索。
在这里,我们使用 Python zip 函数来重建原始键值对列表。但请注意,某些节点已将数据存储在值对附件中。因此,如果使用此方法,则采取一些措施以确保不会意外更改此数据。
快速说明数据类型以及如何确保使用正确的数据类型。有时,整数是 8 位、16 位、带符号还是无符号都不清楚。并且,如果您从未使用过 C 或 C++,您甚至可能不知道如何处理它。可以将光标悬停在节点属性编辑器中的值字段上方,以查看使用的实际内部数据类型。这样,您便可以了解必须使用哪种方法写入或读取字段中的值。我想在文档中执行全文搜索,并尝试在节点属性编辑器中查找数据类型的匹配方法。如果采用了错误的方法,将收到错误消息。因此,只需确保测试您使用的方法,应该就没问题。
今天就到这里!感谢您的加入!这是面向 VRED Pro 的 Python 脚本教程系列的最后一个视频。不过,我们还提供了面向新 VRED Core 的 Python 教程,如果您感兴趣,欢迎观看。
下面是教程 12:使用 vrFieldAccess
进行低级别字段访问视频随附的 Python 脚本示例。
要下载这些压缩文件,请单击此处。
# Simple Field Access
material = createMaterial("UPhongMaterial")
material.setName("Python Material")
fields = material.fields()
fields.setVec3f("`diffuseColor`", 1, 0, 0)
# Complex Field Access
leatherMatFields = findMaterial("Leather red").fields()
colorComponentData = `vrFieldAccess`(leatherMatFields.`getFieldContainer`('colorComponentData'))
bumpComponent = `vrFieldAccess`(colorComponentData.`getFieldContainer`('bumpComponent'))
bumpImageComponent = `vrFieldAccess`(bumpComponent.`getFieldContainer`('image'))
width = bumpImageComponent.getInt32("width")
height = bumpImageComponent.getInt32("height")
print(width, height)
# Attaching arbitrary data to a node field
envNode = findNode("EnvironmentsTransform")
customAttachment = createAttachment("ValuePair")
`vrFieldAccess`(customAttachment).setMString('key', ['key1', 'key2', 'key3'])
`vrFieldAccess`(customAttachment).setMString('value', ['value1', 'value2', 'value3'])
envNode.addAttachment(customAttachment)
# Reading the values from the attachment
envNode = findNode("EnvironmentsTransform")
attachmentFieldAccess = `vrFieldAccess`(envNode.getAttachment("ValuePair"))
keys = attachmentFieldAccess.getMString('key')
values = attachmentFieldAccess.getMString('value')
keyValuePairs = list(zip(keys, values))
print(keyValuePairs)