在 ThreeJS 中为 .obj 添加颜色

2024-01-09

我是 ThreeJS 的新手,有一个简单的问题。我有以下可以正常工作的代码,但我无法向我的 .obj 添加颜色。简而言之,我在 Solidworks 2012 中设计了一个游戏控制器,然后将 CAD 文件导出为 .stl。然后我使用 MeshLab 将 .stl 导出为 .obj。现在我在 ThreeJS 中使用 .obj 并且它可以工作,但我一生都无法将颜色添加到 .obj 中。这是代码

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - loaders - vtk loader</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body {
                font-family: Monospace;
                background-color: #000;
                color: #fff;
                margin: 0px;
                overflow: hidden;
            }
            #info {
                color: #fff;
                position: absolute;
                top: 10px;
                width: 100%;
                text-align: center;
                z-index: 100;
                display:block;
            }
            #info a, .button { color: #f00; font-weight: bold; text-decoration: underline; cursor: pointer }
        </style>
    </head>

    <body>
        <div id="info">
        <a href="" target="_blank">three.js</a> -
        vtk format loader test -
        model from <a href="" target="_blank">The GeorgiaTech Lagre Geometric Model Archive</a>,
        </div>

        <script src="three.min.js"></script>

        <script src="TrackballControls.js"></script>

        <script src="OBJLoader.js"></script>
        <script src="BinaryLoader.js"></script>
        <script src="Detector.js"></script>
        <script src="stats.min.js"></script>

        <script>

            if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

            var container, stats;

            var camera, controls, scene, renderer;

            var cross;

            init();
            animate();

            function init() {

                camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 0.01, 1e10 );
                camera.position.z = 200;
                camera.position.y = 200;

                controls = new THREE.TrackballControls( camera );

                controls.rotateSpeed = 5.0;
                controls.zoomSpeed = 5;
                controls.panSpeed = 2;

                controls.noZoom = false;
                controls.noPan = false;

                controls.staticMoving = true;
                controls.dynamicDampingFactor = 0.3;

                scene = new THREE.Scene();

                scene.add( camera );

                // light

                var dirLight = new THREE.DirectionalLight( 0xffffff );
                dirLight.position.set( 20, 20, 100 ).normalize();

                camera.add( dirLight );
                camera.add( dirLight.target );

                // texture

                var manager = new THREE.LoadingManager();
                manager.onProgress = function ( item, loaded, total ) {

                    console.log( item, loaded, total );

                };

                var texture = new THREE.Texture();

                var loader = new THREE.ImageLoader( manager );
                loader.load( 'bigthumbnail.jpg', function ( image ) {

                    texture.image = image;
                    texture.needsUpdate = true;

                } );

                var loader = new THREE.OBJLoader()
                loader.load( 'Gamepad.obj', function ( object ) {

                    object.position.y = 0;
                    scene.add( object );                

                } );
                // renderer

                renderer = new THREE.WebGLRenderer( { antialias: false } );
                renderer.setSize( window.innerWidth, window.innerHeight );

                container = document.createElement( 'div' );
                document.body.appendChild( container );
                container.appendChild( renderer.domElement );

                stats = new Stats();
                stats.domElement.style.position = 'absolute';
                stats.domElement.style.top = '0px';
                container.appendChild( stats.domElement );

                //

                window.addEventListener( 'resize', onWindowResize, false );

            }

            function onWindowResize() {

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

                controls.handleResize();

            }

            function animate() {

                requestAnimationFrame( animate );

                controls.update();
                renderer.render( scene, camera );

                stats.update();

            }

        </script>

    </body>
</html>

我浏览了 Threejs.org 网站并查看了大部分示例。所有使用复杂颜色的示例都使用 .bin 文件或 .js 文件。所以我下载了Python 2.7.6,安装它并运行convert_obj_third.py。这生成了一个 .js 文件,但我不确定它的格式是否正确。不幸的是,convert_obj_third.py 给我的输出太大,无法发布。我的第二个问题是哪种文件格式最适合复杂的着色,例如铬蓝? .bin、.js 还是可以使用 .obj?如果使用 .js 是最好的方法,那么如何可靠地将 .obj 文件转换为 .js?顺便说一下,我尝试使用convert_obj_third.py创建的.js,但网页始终是空白的。似乎我无法使用 THREE.JSONLoader() 加载 .js。

提前致谢。


after loader.load函数执行后你会得到一个 Threejs Object3D 对象。其中包含对象的网格。

所以你需要遍历它们来改变材质的颜色。代码将是这样的。

var loader = new THREE.OBJLoader()
                loader.load( 'Gamepad.obj', function ( object ) {

                   object.traverse( function ( child ) {
                             if ( child instanceof THREE.Mesh ) {
                                  child.material.ambient.setHex(0xFF0000);
                                  child.material.color.setHex(0x00FF00);
                                 }
                             } );

                    object.position.y = 0;
                    scene.add( object );                
            } );

现在,对象的材质有两个属性决定其颜色,如您在代码中看到的那样ambient and color .

这就是说,如果场景中有白色AmbientLight该对象将显示为红色(因为环境属性设置为#FF0000)

如果物体被其他类型的光照亮,例如pointlight or directionalLight(如上面的情况)对象将显示为绿色(如color设置为#00FF00)。

现在最后一种情况,如果你说你有一个白色的AmbientLight和一个DirectionalLight在场景中,那么该对象将显示为黄色material.ambient and material.color两者都会发挥作用,红色+绿色将呈现为黄色。 希望这有帮助。

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

在 ThreeJS 中为 .obj 添加颜色 的相关文章

  • 如何从 cdn THREE.js 加载 GLTFLoader

    我在弄清楚如何让 GLTFLoader 在 THREE js 中工作时遇到一些问题 我不明白如何使用 CDN 站点来托管文件 我尝试过使用网络上示例的链接 但这并没有完成我的工作 我在另一篇文章中读到 GLTFLoader 文件必须与我正在
  • 如何制作可点击的 CSS3DObject

    我正在使用三个 JS CSS3DRenderer 尝试使 CSS3DObject 在单击时更新其position z 这是我的代码 var element document createElement div element style w
  • ThreeJS中InstancedMesh和InterleavedBuffer的区别和使用

    任何人都可以帮助我们解决 Threejs 中 InstancedMesh 和 InterleavedBuffer 之间的区别吗 我对这两个主题都感到困惑 任何人都可以让我知道哪种是渲染大量几何图形的优化方法 提前致谢 实例化渲染和交错缓冲区
  • Three.js 在平面上旋转相机

    我的应用程序中有一个相机 camera new THREE PerspectiveCamera 75 window innerWidth window innerHeight 0 1 1000 camera position z 1 cam
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • 三个js如何手动添加三角形到BufferGeometry

    我一直在尝试找到使用 Three js 更改网格顶点的最快方法 我发现 如果我更改 mesh geometry attributes position array 的部分内容 然后设置 mesh geometry attributes po
  • 从数组 THREE.js 创建纹理

    我正在研究地形生成器 但我不知道如何处理颜色 我希望能够生成一张占据整个 PlaneGeometry 的图像 我的问题是如何根据我的高度图创建一个覆盖整个 PlaneGeometry 没有环绕 的单个图像 我可以想到一种方法 但我不确定它是
  • 绕局部轴旋转

    我正在尝试实现一个对象 围绕一个位置 POI 兴趣点 飞行并面向它 当您按 WASD 时 您可以更改 POI 的旋转 A 和 D gt 更改 y 轴 W 和 S 更改 x 轴 正如您在演示中看到的 http jsbin com yodusu
  • Threejs + Vanilla JS 和 React-Three-Fiber + Create-React-App 之间的颜色差异

    这已经困扰我一段时间了 为什么 React Three Fiber 中的材质颜色看起来比 Threejs 中暗淡 两种实现中的对象及其属性是相同的 Threejs 版本相同 在新引导中实施 create react app 没有额外的依赖项
  • 扩展 Three.js 类

    我想扩展 Three js Object3D 类 但不知道该怎么做 有一个 Stackoverflow 问题 我已经阅读 重新阅读和尝试过 但无法让它为我工作 有没有办法扩展 ThreeJS 对象 https stackoverflow c
  • 动画 GIF 作为 THREE.js 中的纹理

    我正在寻找一种在 THREE js 中使用 GIF 动画作为纹理的方法 我目前可以加载纹理 甚至是 GIF 格式 但它无法播放动画 有什么办法可以做到吗 我发现了一些像这样的链接 https github com JordiRos GLGi
  • 在 Three.js 中渲染具有大量对象的多个场景的最佳方式

    想象一下 您想要绘制两个场景 每个场景都有数百个球体 并提供在这些场景之间切换的功能 做到这一点的最佳方法是什么 目前 一个开关大约需要 4 到 5 秒 因为我要删除 创建和绘制每个开关上的所有球体 下面是在场景切换上运行的代码示例 cle
  • Three.js:基于图像的光照(IBL)

    I m searching to add an IBL to my scene and objects But I can t find anything on the web There are some examples with an
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • 如何计算给定坐标处相机可见矩形的大小? [复制]

    这个问题在这里已经有答案了 我制作了一个小型的 Three js 应用程序 它将一堆圆圈从画布的底部移动到顶部 let renderer scene light circles camera initialize animate funct
  • 使用 ThreeJS 获取球体纹理上的点击位置

    目前 我有一个带有纹理的球体 它绕 y 轴旋转 我还有在 3D 空间中单击的位置 以及球体上的旋转位置 我认为 目标 获取纹理上的位置 例如 我想获取我点击的图像的哪个方块 参见示例球体和下图 在实践中 我不会使用此图像 但我觉得这将是一个
  • ThreeJS bufferGeometry 位置属性在应用翻译时不会更新

    我使用 STLLoader 将 stl 加载到返回 BufferGeometry 的 ThreeJS 场景中 然后我用了 myMesh position set x y z myMesh rotation setFromQuaternion
  • Three.js 椭圆

    如何在 Three js 中创建一个椭圆 我看过这个 在 THREE js 中绘制椭圆 https stackoverflow com questions 11419896 drawing an ellipse in three js 但如
  • 在 Three.js 中从 Web Worker 加载纹理

    当将大纹理图像应用到网格上一段明显的时间时 Three js 会锁定浏览器的主线程 让我们考虑以下示例 var texLoader new THREE TextureLoader texLoader load someLargeTextur

随机推荐

  • 如何使用c#检查xml文件是否为空

    大家好 我想检查我的 xml 文件是否为空 我正在尝试将一个 xml 数据更新为另一个 为此我正在使用以下代码 现在请告诉我如何检查我的 xml 文件是否有数据 这是我用来更新 xml 文件的代码 protected void CheckU
  • 使用索引搜索相似的单词

    我需要使用某种模糊搜索 例如来自 Oracle 的模糊搜索 并使用索引来搜索数据库表 因为我不需要表扫描 有大量数据 我想忽略大小写 语言特殊内容 和特殊字符 如 等 搜索 maria cool 应该得到 maria COOL 和 Mar
  • Spring Security + Keycloak:登录后403

    我尝试重现一个https www baeldung com spring boot keycloak教程进行了一些简化 我的 Keycloak 服务器也在另一台机器上 由于弃用 配置也略有变化antMatchers Configuratio
  • RestController 设计之争 - Spring Boot REST API

    我对 REST API 开发还很陌生 我决定使用 Spring Boot 创建一个博客应用程序 但我真的在为应用程序的设计和结构而苦苦挣扎 现在我的应用程序由帖子和评论模型和存储库组成 对于这两个模型 我创建了服务类 PostService
  • iPhone 5 上的 Sqlite 磁盘 I/O 错误

    我有一个应用程序大量使用 SQLite 它在模拟器和 iPhone 4 4s 上都能完美运行 当我在 iphone 5 及更高版本上安装时 出现此错误 Unknown error finalizing or resetting statem
  • 在浏览器外通过 Silverlight 调用 Office Communicator

    当浏览器耗尽时 我需要调用 Office Communicator 创建聊天窗口并直接从 Silverlight 拨打电话 当在浏览器中运行时 我这样做并且效果很好 System Windows Browser HtmlPage Windo
  • Angular/Cordova:Android 设备上的 MIME 类型问题

    我创建了一个 Cordova 应用程序 它在创建新项目时仅提供默认的 Angular 欢迎页面 它在浏览器中运行良好 通过 Android Studio 在模拟器上运行它时效果很好 当我在 Android 设备上运行它时 我得到一个空白页面
  • 引用名称包含点的 bash 变量

    我有一个 bash 变量 agent1 ip with 192 168 100 137作为它的价值 当我在中提到它时echo像这样 echo agent1 ip 结果是 ip 我如何访问该值 UPDATE 我的变量是 Bash 本身不理解带
  • HTML 重写的最佳替代方案是什么?

    考虑这个文档片段 div h1 An article about John h1 p The frist paragraph is about John p p The second paragraph contains a a href
  • 未处理的异常类型错误

    我以前从未遇到过此错误 所以我不知道该怎么做或它意味着什么 未处理的异常类型OperationApplicationException 它出现在这段代码中 public void putSettings SharedPreferences
  • 如何修复“重大更改:webpack < 5 默认情况下用于包含 Node.js 核心模块的 polyfills”错误?

    我正在尝试构建一个 React 应用程序 但每次运行 npm start 时 都会收到此消息 找不到模块 错误 无法解析 Users abdus Documents GitHub keywords tracker node modules
  • 如何动态渲染美人鱼流程图?

    我正在使用mermaid https mermaid js github io mermaid n00b gettingStarted用于构建流程图的库 其工作原理是在块内有一个伪代码 特殊语法的命令 在此基础上在块中构建流程图 我希望能够
  • 组合(合并)2 个 JSONObject 的最佳方法是什么?

    组合 合并 两个的最佳方法是什么JSONObjects JSONObject o1 one 1 two 2 three 3 JSONObject o2 four 4 five 5 six 6 以及合并的结果o1 and o2必须是 JSON
  • jQuery,如何使用多个缓存元素

    对于我的项目 我使用缓存选择器来加速 并查看改进 以减少文档内的搜索 var sel1 selector1 var sel2 selector2 在这种情况下如何使用缓存的选择器 例如 selector1 selector2 fadeTo
  • matplotlib 中的曲线文本渲染

    在我正在做的一个项目中 我必须从结构化文件 xml 中获取用户输入 该文件包含一个区域的道路数据 我必须将其绘制到 matplotlib 画布上 问题是 除了道路之外 我还必须渲染道路名称 而且大多数道路都是弯曲的 我知道如何以一定角度渲染
  • Python 完全对齐字符串

    有没有人有一种简洁的方法来完全证明给定线宽的字符串 如下所示 The cat sat on the mat the cat sat on the mat the cat sat on mat the cat sat on the mat t
  • SwiftUI 动态修改文本字段格式、字符串模式、掩码

    我正在尝试使用模式或掩码格式化 SwiftUI TextField 中的数据 为清楚起见 不是 UITextField 一个例子是美国的电话号码 所以用户 可以输入 1115551212 视图中的结果为 111 555 1212 我将在此使
  • Windows UWP 扩展启动屏幕图像在移动设备上渲染不正确

    我为我的 Windows uWP 应用程序构建了一个扩展的启动屏幕 我按照此页面中的示例代码 包括用于扩展启动屏幕的 xaml 进行操作 显示启动画面以延长时间 https msdn microsoft com en us windows
  • React 组件 type.name 是一些抽象字母

    在我的应用程序中 我需要知道children type name 在我的测试项目中我得到了我的期望 const TestChild2 gt td b td 但在我的 生产 项目中 它只是 n 或 Ez 或其他一些随机字母 import Re
  • 在 ThreeJS 中为 .obj 添加颜色

    我是 ThreeJS 的新手 有一个简单的问题 我有以下可以正常工作的代码 但我无法向我的 obj 添加颜色 简而言之 我在 Solidworks 2012 中设计了一个游戏控制器 然后将 CAD 文件导出为 stl 然后我使用 MeshL