如何向 THREE.BufferGeometry 添加面?

2024-02-17

我以编程方式创建了一个简单的网格:

var CreateSimpleMesh = new function () {
    var xy = [],
        maxX = 7,
        maxY = 10,
        river = [[0, 5], [0, 4], [1, 3], [2, 2], [3, 2], [4, 1], [5, 1], [6, 0]],
        grassGeometry = new THREE.BufferGeometry(),
        grassVertexPositions = []

    this.init = function () {
        for (i = 0; i < maxX; i++) {
            for (j = 0; j < maxY; j++) {
                xy.push([i, j])
            }
        }

        for (var i = 0; i < xy.length; i++) {
            grassVertexPositions.push([xy[i][0], xy[i][1], 0])
            grassVertexPositions.push([xy[i][0] + 1, xy[i][1], 0])
            grassVertexPositions.push([xy[i][0], xy[i][1] + 1, 0])

            grassVertexPositions.push([xy[i][0] + 1, xy[i][1] + 1, 0])
            grassVertexPositions.push([xy[i][0], xy[i][1] + 1, 0])
            grassVertexPositions.push([xy[i][0] + 1, xy[i][1], 0])
        }

        for (var i = 0; i < grassVertexPositions.length; i++) {
            for (var j = 0; j < river.length; j++) {
                if (river[j][0] == grassVertexPositions[i][0] && river[j][1] == grassVertexPositions[i][1]) {
                    grassVertexPositions[i][2] = -0.5
                }
            }
        }

        var grassVertices = new Float32Array(grassVertexPositions.length * 3)

        for (var i = 0; i < grassVertexPositions.length; i++) {
            grassVertices[i * 3 + 0] = grassVertexPositions[i][0];
            grassVertices[i * 3 + 1] = grassVertexPositions[i][1];
            grassVertices[i * 3 + 2] = grassVertexPositions[i][2];
        }

        grassGeometry.addAttribute('position', new THREE.BufferAttribute(grassVertices, 3))

    var grassMaterial = new THREE.MeshLambertMaterial({color: 0x00ff00}),
        grassMesh = new THREE.Mesh(grassGeometry, grassMaterial)

        grassMesh.rotation.x = -Math.PI / 2
        Test.getScene().add(grassMesh);
    }
}

问题是这个网格只有顶点。我尝试添加像这样的面孔this https://stackoverflow.com/questions/15795348/generate-mesh-faces-for-vertices-in-three-js使用 THREE.Shape.Utils.triangulateShape 的问题,但 BufferGeometry 与普通几何体不同,并且它不起作用。是否可以向 BufferGeometry 添加面?

EDIT: 工作小提琴 http://jsfiddle.net/grz671u9/


以下是如何创建一个网格BufferGeometry。这是更简单的“非索引”BufferGeometry其中顶点不共享。

// non-indexed buffer geometry
var geometry = new THREE.BufferGeometry();

// number of triangles
var NUM_TRIANGLES = 10;

// attributes
var positions = new Float32Array( NUM_TRIANGLES * 3 * 3 );
var normals   = new Float32Array( NUM_TRIANGLES * 3 * 3 );
var colors    = new Float32Array( NUM_TRIANGLES * 3 * 3 );
var uvs       = new Float32Array( NUM_TRIANGLES * 3 * 2 );

var color = new THREE.Color();
var scale = 15;
var size = 5;
var x, y, z;

for ( var i = 0, l = NUM_TRIANGLES * 3; i < l; i ++ ) {

    if ( i % 3 === 0 ) {

        x = ( Math.random() - 0.5 ) * scale;
        y = ( Math.random() - 0.5 ) * scale;
        z = ( Math.random() - 0.5 ) * scale;

    } else {

        x = x + size * ( Math.random() - 0.5 );
        y = y + size * ( Math.random() - 0.5 );
        z = z + size * ( Math.random() - 0.5 );

    }

    var index = 3 * i;

    // positions
    positions[ index     ] = x;
    positions[ index + 1 ] = y;
    positions[ index + 2 ] = z;

    //normals -- we will set normals later

    // colors
    color.setHSL( i / l, 1.0, 0.5 );
    colors[ index     ] = color.r;
    colors[ index + 1 ] = color.g;
    colors[ index + 2 ] = color.b;

    // uvs
    uvs[ index     ] = Math.random(); // just something...
    uvs[ index + 1 ] = Math.random();

}

geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );
geometry.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ) );
geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );

// optional
geometry.computeBoundingBox();
geometry.computeBoundingSphere();

// set the normals
geometry.computeVertexNormals(); // computed vertex normals are orthogonal to the face for non-indexed BufferGeometry

有关创建的许多其他示例,请参阅 Three.js 示例BufferGeometry。另请查看源代码PlaneGeometry and SphereGeometry,这相当容易理解。

三.js r.143

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向 THREE.BufferGeometry 添加面? 的相关文章

随机推荐

  • 捕获目录内发生的事件

    我正在使用以下方式观看目录Java 7 nio WatchService通过使用以下方法 Path myDir Paths get rootDir try WatchService watcher myDir getFileSystem n
  • 访问 Access 2013 数据库的架构

    如果我尝试读取 Access 2013 数据库的架构 我会收到以下错误 no read permission on MSysRelationships 现在帮助告诉我 User level security features are not
  • 如何将类添加到 simple_form 2 包装器中的输入组件

    我正在努力拥有class text 在我的输入字段中使用名为 hinted in simple form 2 0 0 rc 的自定义包装器时 config wrappers hinted do b b use input class gt
  • 为什么这个 TensorFlow 实现远不如 Matlab 的神经网络成功?

    作为一个玩具示例 我正在尝试拟合一个函数f x 1 x来自 100 个无噪声数据点 matlab 默认实现非常成功 均方差约为 10 10 并且插值完美 我实现了一个神经网络 其中一个隐藏层包含 10 个 S 型神经元 我是神经网络的初学者
  • NodeJS 中是否可以实现多线程?

    所以我有一个应用程序Socket IO其目的是在不同站点上搜索一些数据 像爬虫之类的东西 主要问题是搜索过程太长 当它发生时我的应用程序卡住了 例如 如果一个用户开始第二次搜索需要等到第一次完成 每个需要搜索的网站都表示为一个单独的类 因此
  • 使用 sed 将带有斜杠的已定义变量的文本替换为空格[重复]

    这个问题在这里已经有答案了 我正在尝试使用 sed 来用已定义的变量替换带有空格的行 例如 我想用 lan 和 lan afile py 替换 哑字符串 我以为这条线是 sed s a dumb string lan g file txt
  • 当程序员使用术语“暴力解决问题的方法”时,他们的意思是什么?

    我想了解程序员在工作中使用术语 暴力 时通常意味着什么 许多编程问题都是对数据空间的搜索 例如列表 树 图等的遍历 在解决问题时 所有数据都被搜索或遍历 如果人们想让代码更快 他们就会开始注意到可用于删除搜索空间中不必要部分的模式 当代码搜
  • 业力打字稿找不到模块

    我有一个非常小的项目 我正在尝试为其设置单元测试 该项目使用时编译良好tsc直接地但是 在尝试执行使用 karma typescript 框架的测试时 我收到以下 Typescript 编译错误 ERRORS 错误 compiler kar
  • 将 XML 扁平化为 HTML 表格

    必须有一种通用方法来转换某些分层 XML 例如
  • PHPUnit 测试函数,具有通过引用传递的值和返回值

    大家好 我需要测试一段调用另一个类的函数的代码 我现在无法编辑 我只需要测试它 但问题是这个函数有一个通过引用传递的值和一个返回的值 所以我不知道如何模拟它 这是列类的功能 public function functionWithValue
  • 将 strstream 转换为 sstream 关​​于 c_str() 的冲突

    我有这样的代码块strstream 我把它转换为sstream如下 我不确定 但我认为printStream gt str 返回一个字符串对象 其中包含由指向的流缓冲区中的内容的副本 临时 printStream 然后你调用c str 并得
  • 阻止 Visual Studio 自动更改 IIS 虚拟目录的物理路径?

    我有一个 Visual Studio 解决方案 其中包含一个 Web 应用程序项目 以及其他一些项目 Visual Studio 典型 设置似乎坚持认为二进制文件的输出目录位于项目源目录的根目录中 特别是 每次打开Web应用程序项目时 Vi
  • iOS 10.1 启动应用程序时出现警告

    为什么应用程序收到此警报以及如何解决此问题 AppName 可能会减慢您的 iPhone 该应用程序的开发人员需要更新它以提高其兼容性 我已经浏览过这个链接 iOS 10 1 模拟器显示 应用程序可能会减慢您的 iPhone 速度 http
  • 获取使用 calc 等表达式的 CSS 变量的计算值

    在 JavaScript 中 您可以使用以下命令获取 CSS 变量的值getPropertyValue property https developer mozilla org en US docs Web API CSSStyleDecl
  • Sinatra/Rack 的一个非常简单的身份验证方案是什么

    我正忙于将一个非常小的 Web 应用程序从 ASP NET MVC 2 移植到 Ruby Sinatra 在 MVC 应用程序中 当根据数据库正确验证用户登录时 FormsAuthentication SetAuthCookie 用于设置持
  • 如何使用接口实现松耦合?

    我似乎不明白接口如何实现松耦合的概念 您可能会发现这个问题与其他问题重复 但我已经阅读了许多与该主题相关的答案 但没有找到令人满意的解释 下面是许多开发人员实现松散耦合的示例 interface shape public function
  • 如何禁用 Django allauth 中的中间注销页面

    How to disable the intermediate signout page from django allauth When the user clicks on the signout link on my site I w
  • 使用“copy”属性来维护不可变的 NSString

    我对 iOS 开发和 Objective C 编程非常陌生 我一直在应用程序开发库上做练习 这是我正在尝试理解的当前练习 3 测试如果您将可变字符串设置为该人的名字 然后在调用修改后的 sayHello 方法之前更改该字符串 会发生什么情况
  • SwiftUI 中联系人应用程序中的联系人列表

    您好 我正在尝试构建一个列出所有联系人的界面 就像Contacts and Phone应用程序具有相同的UI 到目前为止我所尝试的如下 基本上我尝试实施CNContactPickerViewController from ContactsU
  • 如何向 THREE.BufferGeometry 添加面?

    我以编程方式创建了一个简单的网格 var CreateSimpleMesh new function var xy maxX 7 maxY 10 river 0 5 0 4 1 3 2 2 3 2 4 1 5 1 6 0 grassGeom