threejs论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 747|回复: 0

three.js 模型详解和外部模型详解

[复制链接]

227

主题

203

帖子

589

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
589
发表于 2022-7-26 10:59:52 | 显示全部楼层 |阅读模式
原文链接:https://blog.csdn.net/weixin_50207776/article/details/119931486

three.js场景渲染模型,基于项目来说大多数模型都是建模师提供的,three.js建模api有限,无法制作出过于精美和写实的模型,而且代码量过大效率低。


1.three.js建立模型

  内置ipa包括很多形状。



更多几何体api可以参考官方文档(http://www.yanhuangxueyuan.com/Three.js/

// 立方体模型
var geometry1 = new THREE.BoxGeometry(100, 100, 100);
var material1 = new THREE.MeshLambertMaterial({
  color: 0x0000ff
});
// 球体模型
var geometry2 = new THREE.SphereGeometry(60, 40, 40);
var material2 = new THREE.MeshLambertMaterial({
  color: 0xff00ff
});
// 圆柱模型
var geometry3 = new THREE.CylinderGeometry(50, 50, 100, 25);
var material3 = new THREE.MeshLambertMaterial({
  color: 0xffff00
});

//几何体模型初始化
var mesh1 = new THREE.Mesh(geometry1, material1);
scene.add(mesh1); //模型添加到场景中
var mesh2 = new THREE.Mesh(geometry2, material2);
scene.add(mesh2);
var mesh3 = new THREE.Mesh(geometry3, material3);
mesh3.position.set(120,0,0);//设置mesh3模型对象的xyz坐标为120,0,0
scene.add(mesh3); //
模型搭建时需要载体,也就是模型的材质。模型的材质在three.js中也提供有 大量api,此处仅用基础材质。一个模型的组成是模型api+模型材质。初始化模型var mesh1 = new THREE.Mesh(geometry1, material1); //geometry1为模型api,material1为模型材质
scene.add(mesh1); //模型添加到场景

模型材质中可以对模型进行内含元素的设置。在初始化模型材质的时候对其进行设定。
var material3 = new THREE.MeshLambertMaterial({
  color: 0xffff00//模型颜色设置
});

模型可以设置的属性有很多,包括:颜色,贴图,粗糙度,金属度,透明度等等,具体可以参考官方文档。(郭隆邦)(http://www.yanhuangxueyuan.com/t ... s/MeshBasicMaterial

模型的属性分为公有属性和私有属性,不做过多举例。他们可以设置的属性是很根据你选用的材质决定的。例如PBR材质,可以设置公有属性还可以设置他私有的私用属性。

2.three.js 引入外部模型

  引入外部模型就是建模师制作的精美的模型对象,通过文件形式发送给你,我们利用js和加载器对模型进行渲染。(注意:外部引入的模型一定要使用与之文件格式对应的加载器,而且外部模型的引入一定要搭建服务器,本地是读取不到的。)加载器的api根据文件形式选用,常见的模型文件格式为json,glb,gltf,fbx等。

let loader = new THREE.GLTFLoader();
        loader.load('phone.glb', function (gltf) {
            gltf.scene.traverse(function (child) {
                if (child.isMesh) {
                    child.material.emissive = child.material.color;
                    child.material.emissiveMap = child.material.map;
                }
            });
            meshh = gltf.scene;
            scene.add(meshh);//将模型加入场景
})


模型加入场景时默认位置说场景中心位置。可以通过
var axes = new THREE.AxisHelper(500);
scene.add(axes);在场景中加入辅助的坐标系。

模型在场景中的位置可以用mesh.position进行设定。

对外部模型的必要优化:

renderer = new THREE.WebGLRenderer({//开启渲染器的抗锯齿
            antialias: true,
            logarithmicDepthBuffer: true,
        });
加载器中对模型子集进行遍历,将颜色通道和贴图通道重新设定


gltf.scene.traverse(function (child) {
                if (child.isMesh) {
                    child.material.emissive = child.material.color;
                    child.material.emissiveMap = child.material.map;
                }
            });

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|threejs论坛 ( 京ICP备18014583号 )

GMT+8, 2023-12-1 23:57 , Processed in 0.018604 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表