当前位置: 首页 > 知识库问答 >
问题:

threejs合并平面几何体或从多个图像创建纹理

晏炳
2023-03-14

我有一组平面几何体,每一个都有自己的url纹理。在导航(缩放/平移)过程中的任意点,容器(THREE.Object3D)包含26个平面几何图形。如何将它们合并到一个大平面,以便可以为合并几何体中的所有平铺应用高贴图。

或者我如何从36个图像中获得所有的纹理。(目前作为MeshPhong材质的映射属性)到单个几何?

编辑:

目前,我按照Dainel的建议创建了一个大几何体。并将纹理放置到几何体中,该几何体是通过画布的一组图像的组合纹理。

context = canvas.getContext( '2d' );
var img = Image();
img.src = url //url of the texture tile
context.drawImage(img,xpos, ypos);

这是做或每一个图像。每个图像都有一个url、xpos和YPO。图像是预加载的,加载每个图像后,将调用一个回调函数,该函数创建几何体(平面)并从画布添加纹理。

  var texture = new THREE.Texture(canvas); 
  texture.needsUpdate = true;
    var material = new THREE.MeshPhongMaterial({ map : texture });

平面几何(canvas.width,canvas.height,57,40); var网格=new THREE. Mesh(地理,材料);scene.add(网格);

此外,我用高度值更新几何的z顶点。

共有2个答案

司徒俊雄
2023-03-14

使用terraLoader类的三个js和画布纹理,我能够实现

  scene = new THREE.Scene();

  camera = new THREE.PerspectiveCamera(45, mywidth / myheight, 0.01, 10000);
  camera.position.set(0, 0, 240);

  scene.add(new THREE.AmbientLight(0xeeeeee));

  renderer = new THREE.WebGLRenderer();
  renderer.setSize(mywidth, myheight);

  var group = new THREE.Object3D();

  var canvas = document.createElement( 'canvas' );
  canvas.width = mywidth;
  canvas.height = myheight;

  var ctx = canvas.getContext('2d');

  /* adjust width, height, segments based on height data;*/

  /* create a plane geometry */
  var geom = new THREE.PlaneGeometry(800, 692, 40, 55);

  /* 
  read height values from .bin file uing terrainLoader 
  and update the Z values of the plane 
   */

  heightdata = 'assets/heightmap.bin'; 
  terrainLoader.load(heightdata, function(data) {

    /* bin file generated from USGS SRTM tile */ 
    for (var i = 0, l = geom.vertices.length ; i < l; i++) {
      geom.vertices[i].z =   data[i] / 200; /*simple scale */
    }

    geom.verticesNeedUpdate = true;
  });

   /* 
   create a texture from canvas created above with width and height
   of the of the scene. This is to be careful as the size of texture 
   image may not be the same but as same ratio as height map. 
   Atleast for my case it was the situation. But geometry width and 
   texture width are in same ratio. So that i need a small array of 
   heightmap from bin but a much bigger texture 
   */   

  var texture = new THREE.Texture(canvas); 
  var material = new THREE.MeshPhongMaterial({ map : texture });
  var mesh = new THREE.Mesh(geom, material);
  group.add( mesh );
  scene.add(group);

现在要将多个图像绘制到画布,请选中此页面

我将复制HTML5画布图像加载程序教程中的代码

   function loadImages(sources, callback) {
        var images = {};
        var loadedImages = 0;
        var numImages = 0;
        // get num of sources
        for(var src in sources) {
          numImages++;
        }
        for(var src in sources) {
          images[src] = new Image();
          images[src].onload = function() {
            if(++loadedImages >= numImages) {
              callback(images);
            }
          };
          images[src].src = sources[src];
        }
      }

      var sources = {
        darthVader: 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg',
        yoda: 'http://www.html5canvastutorials.com/demos/assets/yoda.jpg'
      };

在上述代码中,从heightmap更新平面几何图形后,可以调用loadImages函数。

 loadImages(sources, function(images) {

        //context = context of the texture put in threejs texture

        context.drawImage(images.darthVader, 100, 30, 200, 137);
        context.drawImage(images.yoda, 350, 55, 93, 104);
      });
邢永安
2023-03-14

你可以创建一个“大”平面并对其应用合并纹理

或者u可以手动设置每个平面的顶点Y值,以匹配高度贴图的相应部分。因此,你有一组单独的平面,它们共享相同的“基准”高度贴图。

你好,丹尼尔

 类似资料:
  • 我试图在GeoPandas中找到两个多边形的并集,并输出一个包含两个多边形的点作为其顶点的单个几何体。函数为每个单独的并集提供多边形,但我想要一个多边形。 在上下文中,我使用它将两个行政区域合并为一个区域(即包括一个国家内的一个城镇区)。 下面的例子来自geopandas网站,说明了我想要的: 没有一个输出几何是我所期望的,这是以下内容: 首先,如何使用GeoPandas或shapely从输入多边

  • 问题内容: 我正在寻找一个Java库,该库可以获取图像(PNG)并创建PDF。或直接从已绘制的Java面板中创建PDF。 问题答案: 您可以使用Gnostice PDFOne for Java(http://www.gnostice.com/PDFOne_Java.asp)实现此目的。 在下面的代码片段中找到可从PNG图像创建PDF文档的代码。 要从JPanel创建BufferedImage,可以

  • 我正在寻找一个Java库,将可以采取一个图像(PNG)和创建一个PDF。或者直接从已绘制的java面板创建PDF。

  • 初学者学习本章节如果感觉有些困难,或者急于实现某些功能,可以暂时跳过。不过学习本章节的好处是,你可以理解Threejs所谓的几何体Geometry本质上是什么,通过本章节的学习建立Threejs顶点的概念,更有助于后面很多课程的学习。 当然了,如果你有一定的WebGL基础,对于来说早就建立了顶点的概念,那么你学习本章节课,和没有WebGL基础的初学者策略可以不同,可以把重心放在Threejs几何体

  • 我想从stripe上的应用程序创建一个计划。这种情况是,用户以不同的价格作为经常性付款。所以,这就是为什么我要为每个用户创建计划。 我正在使用laravel 5和

  • 从已经加载的纹理贴图集中创建精灵 通常Pixi给你三种方式从已经加载的纹理贴图集中创建精灵: 使用 TextureCache: let texture = TextureCache["frameId.png"], sprite = new Sprite(texture); 如果你是使用的 loader来加载纹理贴图集, 使用loader的 resources: let sprite = new S