(十九) THREE.Material 知识详解

THREE.Material 是 Three.js 中的一个基类,用于定义三维物体的外观属性,如颜色、纹理、透明度等。Three.js 提供了多种不同的材质类型,每种材质都有其独特的特性和用途,以满足不同的渲染需求。THREE.Material 本身是一个抽象基类,实际使用的材质都是其子类。


常见的材质类型

以下是 Three.js 中一些常见的材质类型及其特点:

1. THREE.MeshBasicMaterial

  • 特性:不考虑光照,适用于不需要光照效果的情况。
  • 属性:主要属性包括颜色 (color)、透明度 (opacity) 和透明模式 (transparent)。

示例

var material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });

2. THREE.MeshLambertMaterial

  • 特性:使用 Lambertian 反射模型,模拟漫反射效果。
  • 属性:除了颜色和透明度外,还包括环境贴图 (envMap)、法线贴图 (normalMap) 等。

示例

var material = new THREE.MeshLambertMaterial({ color: 0x00ff00 });
3. THREE.MeshPhongMaterial

  • 特性:扩展了 Lambertian 反射模型,支持高光效果。
  • 属性:包括高光强度 (shininess) 和高光颜色 (specular)。

示例

var material = new THREE.MeshPhongMaterial({ color: 0x00ff00, specular: 0x111111, shininess: 10 });
4. THREE.MeshStandardMaterial

  • 特性:物理基础的材质,支持金属度和粗糙度。
  • 属性:包括金属度 (metalness)、粗糙度 (roughness) 和环境贴图 (envMap)。

示例

var material = new THREE.MeshStandardMaterial({ color: 0x00ff00, metalness: 0.5, roughness: 0.5 });
5. THREE.MeshPhysicalMaterial

  • 特性:扩展了标准材质,提供更多物理属性。
  • 属性:包括透明度 (transparency)、折射率 (ior) 和发射光 (emissive)。

示例

var material = new THREE.MeshPhysicalMaterial({ color: 0x00ff00, metalness: 0.5, roughness: 0.5, ior: 1.5 });
6. THREE.ShaderMaterial

  • 特性:允许用户自定义着色器代码。
  • 属性:包括顶点着色器 (vertexShader) 和片段着色器 (fragmentShader)。

示例

var vertexShader = `
  varying vec3 vPosition;
  void main() {
    vPosition = position;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
  }
`;

var fragmentShader = `
  uniform vec3 color;
  varying vec3 vPosition;
  void main() {
    gl_FragColor = vec4(color, 1.0);
  }
`;

var material = new THREE.ShaderMaterial({
  uniforms: { 'color': { value: new THREE.Color(0x00ff00) } },
  vertexShader: vertexShader,
  fragmentShader: fragmentShader
});
材质的基本属性

不论哪种材质类型,都有一些基本的属性是共有的:

  • color:物体的颜色。
  • map:基础颜色贴图。
  • alphaMap:透明度贴图。
  • bumpMap:凹凸贴图。
  • normalMap:法线贴图。
  • displacementMap:置换贴图。
  • specularMap:高光贴图。
  • emissive:物体的自发光颜色。
  • emissiveMap:自发光贴图。
  • transparent:是否开启透明模式。
  • opacity:物体的透明度。
  • side:指定材质在哪一面渲染,可以是 THREE.FrontSideTHREE.BackSide THREE.DoubleSide
  • depthTest:是否进行深度测试。
  • depthWrite:是否写入深度缓冲区。
  • blending:混合模式,如 THREE.AdditiveBlendingTHREE.SubtractiveBlending 等。
  • vertexColors:是否启用顶点颜色。
示例代码

以下是一个简单的示例,展示如何在 Three.js 场景中使用不同的材质:

// 创建场景
var scene = new THREE.Scene();

// 创建相机
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;

// 创建渲染器
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建一个立方体
var geometry = new THREE.BoxGeometry(1, 1, 1);

// MeshBasicMaterial
var materialBasic = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
var cubeBasic = new THREE.Mesh(geometry, materialBasic);
cubeBasic.position.x = -2;
scene.add(cubeBasic);

// MeshLambertMaterial
var materialLambert = new THREE.MeshLambertMaterial({ color: 0x0000ff });
var cubeLambert = new THREE.Mesh(geometry, materialLambert);
cubeLambert.position.x = 0;
scene.add(cubeLambert);

// MeshPhongMaterial
var materialPhong = new THREE.MeshPhongMaterial({ color: 0xff0000, specular: 0x111111, shininess: 10 });
var cubePhong = new THREE.Mesh(geometry, materialPhong);
cubePhong.position.x = 2;
scene.add(cubePhong);

// 创建一个地面平面
var planeGeometry = new THREE.PlaneGeometry(20, 20, 1, 1);
var planeMaterial = new THREE.MeshStandardMaterial({ color: 0x808080 });
var plane = new THREE.Mesh(planeGeometry, planeMaterial);
plane.rotation.x = -Math.PI / 2;
plane.position.y = -0.5;
scene.add(plane);

// 创建平行光
var directionalLight = new THREE.DirectionalLight(0xffffff, 1.0);
directionalLight.position.set(1, 1, 1).normalize();
scene.add(directionalLight);

// 渲染函数
function animate() {
    requestAnimationFrame(animate);

    // 旋转立方体
    cubeBasic.rotation.x += 0.01;
    cubeBasic.rotation.y += 0.01;
    
    cubeLambert.rotation.x += 0.01;
    cubeLambert.rotation.y += 0.01;
    
    cubePhong.rotation.x += 0.01;
    cubePhong.rotation.y += 0.01;

    renderer.render(scene, camera);
}
animate();

在这个示例中,我们创建了三个不同的立方体,并分别为它们指定了不同的材质类型:THREE.MeshBasicMaterialTHREE.MeshLambertMaterial THREE.MeshPhongMaterial。通过观察这三个立方体在平行光照射下的表现,可以对比不同材质之间的差异。

内容概要:本文介绍了一款针对红米K30(代号phoenix)定制的原生RisingOS xt操作系统固件,基于安卓16版本,提供支持线刷的fast模式双版本(含root权限)。该固件通过百度网盘分享,包含下载链接和提取码,强调系统未内置文件管理器,用户需在刷机完成后手动安装相关应用。; 适合人群:熟悉刷机操作、具备一定Android系统定制经验的进阶用户或开发者;适用于希望体验原生系统流畅性并获取root权限的红米K30用户。; 使用场景及目标:①为红米K30用户提供轻量化、接近原生安卓的系统体验;②通过root权限实现深度自定义与高级功能控制;③利用fast线刷方式快速完成系统升级或修复。; 阅读建议:刷机前请确保设备型号完全匹配(phoenix),备份重要数据,确认已解锁Bootloader并了解风险;刷机后注意自行安装必要的工具应用如文件管理器,以保证系统完整可用。1-----刷写前提是手机必须解锁bl先。而且会在fast模式刷写固件2-----刷写方法与官方刷写步骤一样3-----此固件为定制初始固件。可以在fast模式刷写4-----属于适配固件。也许有个别bug。不接受请勿下载5-----需要一定的刷机常识与动手能力的友友刷写。6-----资源有可复制性。下载后不支持退。请知悉7-----定制其他需求可以在csdn私信博主参考博文了解详细:https://csdn9.blog.csdn.net/article/details/151715205?spm=1001.2015.3001.5352
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值