【问题标题】:Forge Viewer Autodesk v7 THREE.Material: 'map' parameter is undefined in THREE.PointCloudMaterialForge Viewer Autodesk v7 THREE.Material:“map”参数在 THREE.PointCloudMaterial 中未定义
【发布时间】:2021-01-31 07:46:49
【问题描述】:

最终编辑:在 Autodesk Forge Viewer v7 中使用 THREE.PointCloudMaterial 已损坏。坚持使用 THREE.ShaderMaterial。

编辑:我使用的 Forge Viewer 具有 Three.js 版本 r71 (source) 的自定义版本,这就是我使用过时代码的原因。

EDIT2:我认为问题可能是因为地图想要使用 THREE.ImageUtils.loadTexture() 而不是 THREE.TextureLoader?当我使用 THREE.ImageUtils.loadTexture() 时,我得到一个 new problem ,其中图像未定义。猜它与回调函数有关?

EDIT3:THREE.Material: 'map' parameter is undefined 消失了 Petr 的回答,但在 Forge Viewer 中仍然看不到纹理:

可能是与WebGL RENDER WARNING: there is no texture bound to the unit 0相关的问题?

代码(抱歉弄乱了):

var PointMaterial = new THREE.PointCloudMaterial({
            color: 0xFF0000,
            size: 5,
            map: "",
        })
new THREE.TextureLoader().load( '../img/epidemics.png', function onLoad(tex) {
            PointMaterial.map = tex;
          });
var geom = new THREE.Geometry(0.5, 0.5, 0.5);
let up_to_down = -4.5
    for (let i = 0; i < 10; i++) {
         let left_to_right = -4.5
         for (let j = 0; j < 10; j++) {
              for (let k = 0; k < 100; k++) {
              var vertex = new THREE.Vector3();
              vertex.x = Math.random() * ((-0.5 + left_to_right) - (0.5 + left_to_right)) + (0.5+left_to_right);
              vertex.y = 0;
              vertex.z = Math.random() * ((-0.5 + up_to_down) - (0.5 + up_to_down)) + (0.5 + up_to_down);
              geom.vertices.push(vertex);
                }
            }
        }
var particles = new THREE.PointCloud(geom, PointMaterial);

编辑到此为止

我的目标是为我的 BoxGeometry 点云引入纹理。

每当我运行以下代码(或任何使用贴图作为纹理的代码)时,我都会在控制台中收到警告。

let geometryForShapes = new THREE.BoxGeometry( 1, 1, 1 );
var materialForShapes = new THREE.PointCloudMaterial({
            map: new THREE.TextureLoader().load( '../data/toppng.com-particles-3000x2000.png' ),
            color: 0xffff00,
            transparent: false,
            opacity: 0.9,
            size: 10,
        })
particles = new THREE.PointCloud( geometryForShapes, materialForShapes )

控制台输出:THREE.Material: 'map' parameter is undefined

r121 文档(我被困在 r71 上):

PointsMaterial Doc

Texture Doc

我的问题是,使用 PointCloudMaterial 是我的错吗?这是一个错误吗?我需要导入一些东西吗?

【问题讨论】:

    标签: three.js autodesk-forge autodesk-viewer autodesk-bim360


    【解决方案1】:

    THREE.Material: 'map' parameter is undefined错误来自three.js,和这行代码有关:

    map: new THREE.TextureLoader().load( '../data/toppng.com-particles-3000x2000.png' ),
    

    three.js R71 中的load 方法不返回任何内容。加载的纹理必须从回调函数中检索,例如,像这样:

    var materialForShapes = new THREE.PointCloudMaterial({
                map: ,
                color: 0xffff00,
                transparent: false,
                opacity: 0.9,
                size: 10,
            });
    
    new THREE.TextureLoader().load( '../data/toppng.com-particles-3000x2000.png', function onLoad(tex) {
      materialForShapes.map = tex;
    });
    

    【讨论】:

    • 感谢您的回复。该消息似乎在控制台中消失了,但纹理仍然没有出现。但是,如果我自己运行three.js(没有Forge Viewer),纹理看起来就很好。请参阅上面 EDIT3 中的代码
    【解决方案2】:

    你的材料创作应该是

    var material = new THREE.PointsMaterial( params );

    不确定您为什么要使用 PointCloudMaterial。 此外,PointCloud 不是 Three.js 中的标准类。您链接到的页面建议您使用积分:

    var points = new THREE.Points( geometry, material );

    【讨论】:

    • 感谢您的回复。我刚刚做了一个编辑。 Forge Viewer 使用过时的 Three.js 版本。很遗憾,Forge Viewer 无法识别 PointsMaterial 和 Points。
    • 嗯,这已经很过时了。看着他们的"Support page",他们说他们的支持团队会寻找[autodesk-forge] 标签,所以希望他们中的一个会很快过来帮助你。如果你不介意我问,你为他们的服务付了多少钱?听起来他们正在收费以使用对所有人免费的过时库并众包他们的客户支持。
    • 可能是this will help?
    • 尝试了链接,但问题仍然存在。在实验室,我们现在正在使用试用版,并且作为研究人员拥有特殊的访问权限。再次感谢您的尝试。希望 Autodesk 的人能很快看到这一点。
    • 对于使用过时版本的three.js,我们知道这对我们的许多客户来说是一个问题,但不幸的是,进行这种升级非常困难。这是一个很长的故事,但 TLDR:Forge Viewer 需要自定义/优化许多 three.js 内部(用于性能改进),但 three.js 并不是完全可扩展的。这两个代码库现在分歧如此之大,以至于试图将它们合并在一起是一个 PITA。
    猜你喜欢
    • 2020-05-06
    • 2020-10-30
    • 2020-04-06
    • 2020-03-09
    • 2020-05-26
    • 2020-12-07
    • 2020-11-24
    • 2020-05-13
    • 2021-05-13
    相关资源
    最近更新 更多