Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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
Aframe 有没有一种方法可以将多个材质组件添加到a形框架中的实体中?_Aframe - Fatal编程技术网

Aframe 有没有一种方法可以将多个材质组件添加到a形框架中的实体中?

Aframe 有没有一种方法可以将多个材质组件添加到a形框架中的实体中?,aframe,Aframe,我正在尝试为a-frame编写一个组件,将不同的材质添加到模型的“侧面”。所以,一个几何体,其组的设置方式允许不同侧面具有不同特性的不同材质 我希望组件的用户能够操纵每种材料的所有属性,使其能够成为单个材料,即所有默认属性都可以声明更改,可以在inspector中进行调整等 考虑到我希望所有材质都像默认材质一样工作,与其通过重写材质组件的所有逻辑来重新发明轮子,例如,确定“src”是否是纹理的图像或视频,并相应地进行操作等。我想知道是否可以将默认材质组件的多个实例添加为组件的一部分 可以理解,这

我正在尝试为a-frame编写一个组件,将不同的材质添加到模型的“侧面”。所以,一个几何体,其组的设置方式允许不同侧面具有不同特性的不同材质

我希望组件的用户能够操纵每种材料的所有属性,使其能够成为单个材料,即所有默认属性都可以声明更改,可以在inspector中进行调整等

考虑到我希望所有材质都像默认材质一样工作,与其通过重写材质组件的所有逻辑来重新发明轮子,例如,确定“src”是否是纹理的图像或视频,并相应地进行操作等。我想知道是否可以将默认材质组件的多个实例添加为组件的一部分

可以理解,这似乎是不可能的,因为我希望能够通过在组件名称后面附加一个带双下划线的ID在a-frame中添加多个组件

例如,如果我将其作为init函数的一部分编写

AFRAME.registerComponent('multimaterial', {

    init: function(){

        this.el.setAttribute('material__one', '')
        this.el.setAttribute('material__two', '')

    },

}) 
我得到以下错误

Uncaught (in promise) Error: Trying to initialize multiple components of type `material`. There can only be one component of this type per entity.
我想我能理解为什么这会被定义为开箱即用的几何体/材质组合,但有没有一种方法可以将材质组件设置为“multiple:true”,然后在我的组件中使用它

或者我需要对代码进行分支吗?如果是这样的话,有谁能向我解释一下最简单的方法吗?鉴于上面描述的用例,似乎材质组件在代码的不同部分都有定义,我的意思是有一个核心组件材质,它会引入一个单独的着色器等

非常感谢您的建议。

材质组件只是在给定几何体上设置了一个3.MeshBasicMaterial

如果您想要更多,您需要深入研究THREE.js-您可以制作一个材质数组,并将其应用于自定义组件中的几何体:

var materials = [new THREE.MeshBasicMaterial({
    color: 0xFF0000
}), new THREE.MeshBasicMaterial({
    color: 0x00FF00
})]

this.el.getObject3D('mesh').material = materials;
在行动中检查它

如果您想检查所处理的源类型,src/utils/src-loader.js有一个简洁的函数,可以帮助您检查源是视频还是图像:

validateSrc(src, loadImageCallback, loadVideoCallback)

谢谢Piotr,这很有帮助。我知道如何在three.js级别添加多个材质,如果我只希望每个材质都有几个简单的属性,那就好了。如果我希望能够定义越来越复杂的内容,比如带有图像和视频等的src属性,那么很快就会有很多重复的逻辑/代码,我想既然已经完成了,并且可以在aframe核心代码中使用,我就可以利用它。但是如果不可能的话,我想我可以把相关的部分复制到我的组件中。恐怕你必须重复使用上面提到的检查-src/utils/src-loader.js,loadImageCallback,loadVideoCallback似乎可以检查你是在处理视频还是图像源。是的,我想这就是我必须做的-谢谢Piotr。