three.js学习 11 - 1.threejs常用几何体 2.几何体材质自定义 3.材质的旋转与堆叠效果

news2025/1/19 23:11:36

1.threejs常用几何体

①.缓冲几何体(立方体)
官网API地址:https://www.three3d.cn/docs/index.html?q=geometry#api/zh/geometries/BoxGeometry
缓冲体
②.圆缓冲几何体
官网地址:https://www.three3d.cn/docs/index.html?q=geometry#api/zh/geometries/CircleGeometry
在这里插入图片描述
③.圆锥
官网地址:https://www.three3d.cn/docs/index.html?q=geometry#api/zh/geometries/ConeGeometry
④.如何在官网中搜索API提供的全部几何体参数:
顺着找

2. 关于几何体材质的设置

// 导入纹理  纹理加载器
const textureLoader = new THREE.TextureLoader()
let img= require('../assets/images/tietu.jpg')  //加载自己的材质贴图
const touxiangTexture = textureLoader.load(img)

// 添加物体
// 创建一个几何体对象
const cubeGeometry = new THREE.BoxGeometry(2, 2, 2)
const cubeMaterial = new THREE.MeshBasicMaterial({
    color: 0xffff00,
    map:touxiangTexture
})
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
scene.add(cube)

在这里插入图片描述

3.自定义材质的偏移与重复

①旋转材质贴图:

// 导入纹理  纹理加载器
const textureLoader = new THREE.TextureLoader()
let img = require('../assets/images/tietu.jpg') //加载自己的材质贴图
const touxiangTexture = textureLoader.load(img)

// 旋转纹理
touxiangTexture.center.set(0.5, 0.5) //表示在中心点位置旋转
// 旋转45deg
touxiangTexture.rotation = Math.PI / 4  //旋转45度

旋转45

②材质贴图的堆叠与镜像效果


// 设置纹理的重复(拉伸)
touxiangTexture.repeat.set(2,3)//水平重复2次  垂直重复三次

但是我们发现默认的堆叠效果并没有实现我们预期的平铺的效果,被拉伸,且没有自适应我们需要进行如下操作:
在这里插入图片描述
③设置纹理堆叠的铺满自适应属性


// 导入纹理  纹理加载器
const textureLoader = new THREE.TextureLoader()
let img = require('../assets/images/tietu.jpg') //加载自己的材质贴图
const touxiangTexture = textureLoader.load(img)

// 旋转纹理
touxiangTexture.center.set(0.5, 0.5) //表示在中心点位置旋转
// 旋转45deg
touxiangTexture.rotation = Math.PI / 4  //旋转45度

// 设置纹理的重复(拉伸)
touxiangTexture.repeat.set(2,3)//水平重复2次  垂直重复三次
// 设置纹理重复的模式(与上面配合使用)
touxiangTexture.wrapS=THREE.RepeatWrapping   //横轴铺满自适应 默认铺满
touxiangTexture.wrapT=THREE.RepeatWrapping   //纵轴铺满自适应
//touxiangTexture.wrapT=THREE.MirroredRepeatWrapping   //纵轴镜像重复

在这里插入图片描述

4. 单页面完整代码:

import * as THREE from 'three'
// 导入轨道控制器
import {
    OrbitControls
} from 'three/examples/jsm/controls/OrbitControls'
// console.log(THREE);

// 2023.05.02  导入gsap动画库
import gsap from 'gsap'
// 2023.05.04  导入datgui
import * as dat from 'dat.gui'

// 基础内容

// 1.创建场景
const scene = new THREE.Scene()
// 2.创建相机
const camera = new THREE.PerspectiveCamera(
    75,
    window.innerWidth / window.innerHeight,
    0.1,
    1000
) //透视相机(角度,宽高比,近端,远端)

camera.position.set(0, 0, 10) //修改相机位置

scene.add(camera) //将相机添加到场景中

// 导入纹理  纹理加载器
const textureLoader = new THREE.TextureLoader()
let img = require('../assets/images/tietu.jpg') //加载自己的材质贴图
const touxiangTexture = textureLoader.load(img)

// 旋转纹理
touxiangTexture.center.set(0.5, 0.5) //表示在中心点位置旋转
// 旋转45deg
touxiangTexture.rotation = Math.PI / 4  //旋转45度

// 设置纹理的重复(拉伸)
touxiangTexture.repeat.set(2,3)//水平重复2次  垂直重复三次
// 设置纹理重复的模式(与上面配合使用)
touxiangTexture.wrapS=THREE.RepeatWrapping   //横轴铺满自适应 默认铺满
 touxiangTexture.wrapT=THREE.RepeatWrapping   //纵轴铺满自适应
//touxiangTexture.wrapT=THREE.MirroredRepeatWrapping   //纵轴镜像重复



// 添加物体
// 创建一个几何体对象
const cubeGeometry = new THREE.BoxGeometry(2, 2, 2)
const cubeMaterial = new THREE.MeshBasicMaterial({
    color: 0xffff00,
    map: touxiangTexture
})
// 根据几何体和材质创建一个物体
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
scene.add(cube)
//初始化渲染器
const renderer = new THREE.WebGLRenderer()

//设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)
console.log(renderer);

// 将webgl渲染的canves内容添加到body上
document.body.appendChild(renderer.domElement)

// 使用渲染器,通过相机,将场景渲染进来
// renderer.render(scene, camera)


// 2023.04.26 使用控制器查看3d物体
// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement) //第一个参数是相机对象,第二个参数是渲染器
// 设置控制器的阻尼感  有真实感  必须在循环调用update()
controls.enableDamping = true
// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5) //参数5代表长度
scene.add(axesHelper) //添加完成后出现坐标轴辅助器

// 2023.05.02  使用补间动画实现动画的操作
// 设置动画 2023.05.04
// let animate1 = gsap.to(cube.position, {
//     x: 5,
//     duration: 5,
//     ease: "bounce.out",
//     repeat: 3, //重复次数
//     // repeat:-1,//-1表示无限循环
//     yoyo: true, //开启往返运动
//     // delay:2,//延迟两秒移动
//     onComplete: () => {
//         console.log('动画完成了:');
//     },
//     onStart: () => {
//         console.log('动画开始了:');
//     }
// }) //参数解释:让(要操作的对象,{哪一条轴:运动到什么位置,duration:花费多少秒})
// 设置旋转 2023.05.04
// gsap.to(cube.rotation, {
//     x: 2 * Math.PI,
//     duration: 5,
//     ease: "power4.in"
// })
// 双击暂停/开始动画  2023.05.03
// window.addEventListener('dblclick', () => {
//     console.log(animate1);
//     if (animate1.isActive()) {
//         animate1.pause() //暂停
//     } else {
//         animate1.resume() //恢复
//     }
// })
// 双击控制开启关闭全屏  2023.05.04
window.addEventListener('dblclick', () => {
    const fullscreenElement = document.fullscreenElement
    console.log('执行了双击', fullscreenElement);
    if (fullscreenElement) {
        document.exitFullscreen()
    } else {
        renderer.domElement.requestFullscreen()
    }
})

// 设置一个渲染函数,浏览器每次刷新重新加载渲染器
// function render(time) {
function render() {
    controls.update()
    renderer.render(scene, camera) //渲染器
    requestAnimationFrame(render) //requestAnimationFrame==》请求动画帧 接收一个渲染函数  渲染下一帧的时候就会执行render函数
}

// 2023.05.04  监听画面变化,更新渲染画面
window.addEventListener('resize', () => {
    console.log('画面变化了,宽高适配执行');
    //更新摄像头
    camera.aspect = window.innerWidth / window.innerHeight
    // 更新摄像机的投影矩阵
    camera.updateProjectionMatrix()
    // 更新渲染器
    renderer.setSize(window.innerWidth, window.innerHeight)
    renderer.setPixelRatio(window.devicePixelRatio)
})

// 创建gui工作台
const gui = new dat.GUI()
gui.add(cube.position, 'x').min(0).max(5).step(0.01).name('x轴').onChange((value) => {
    console.log('x轴结果被实时修改为:', value);
}).onFinishChange((value) => {
    console.log('x轴最终的结果为:', value);
}) //参数解释   (控制的目标,'参数名称').min(最小值).max(最大值).step(每一步的步长)

// 修改颜色
const params = {
    color: "#ffff00",
    fn: () => {
        //让cube动起来
        gsap.to(cube.position, {
            x: 5,
            duration: 3,
            yoyo: true,
            repeat: -1,
            ease: "bounce.out",
        })
    }
}
gui.addColor(params, 'color').name('颜色修改').onChange((value) => {
    console.log('颜色为:', value);
    cube.material.color.set(value)
})
// 控制是否显示
gui.add(cube, 'visible').name('是否显示')

//设置按钮触发事件(动画事件)
// gui.add(params,'fn').name('开启x轴运动')

// 为工具栏添加一个文件夹
var folder = gui.addFolder('设置立方体')
folder.add(cube.material, 'wireframe').name('设置线框')
folder.add(params, 'fn').name('x轴运动')

render() //一开始的时候渲染一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内存一致性(Memory Consistency)模型简介

这里写自定义目录标题 1. 前言2 为什么需要内存一致性(Memory Consistency)模型3. 什么是内存一致性(Memory Consistency)模型4. 各种内存一致性(Memory Consistency)模型4.1 顺序一致性(SC: Sequential Consistency)模型4.2 完全存储定序(TSO: Total Store Order)模型4.3 部分…

外贸人如何精准开发客户?Facebook开发客户全攻略

现在做跨境的都了解的一个社媒平台就是Facebook了,因为很多人都会拿Facebook来开发客户,忙里偷闲,今天东哥就来聊聊用Facebook开发客户的一些心得。 用Facebook开发客户的心得 1、利用关键词搜索 使用行业相关的关键词、产品特定的关键词、相…

菁染料-N-羟基琥珀酰亚胺酯Cyanine7-NHS ester活性脂1432019-64-1

CY7-NHS ester是一种荧光染料,具有橙红色荧光。它的化学式为C41H48ClN3O4,分子量为733.64。CY7-NHS的荧光特性适合生物学应用,它的激发波长为750nm,发射波长为773nm,可用于近红外成像。这种标记物可以用于活细胞成像、…

案例10:Java外卖平台设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

web开发中如何知道表单的数据是否发生了变更,后端框架又是如何响应的,都有哪些方案

前言 针对web界面开发,今天对于一些细节做了一点总结与回想,好久不做web开发了,今天竟然都忘记了以前的界面组件、后端orm映射框架的一些基础知识了,今天主要总结的内容是,当界面提交一个表单后,vue是如何…

【JavaEE】wait/notify方法 和 单例模型

目录 前言 1、 wait和notify 1.1、wait()方法 1.2、notify()方法 1.3、wait和sleep 的对比 2、单例模式 2.1、饿汉模式 2.2、懒汉模式 2.3、上述懒汉模式和饿汉模式在多线程情况下是否安全 2.3.1、解决懒汉模式多线程不安去问题 前言 这里补充…

网络安全面试题合集

以下为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作。 注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题&#xf…

瑞吉外卖 - 启用与禁用员工账号功能(8)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及典型建设项目入河排污口方案报告书

随着水资源开发利用量不断增大,全国废污水排放量与日俱增,部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理,超标排污、未经同意私设排污口等问题逐步显现,已威胁到供水安全、水环境安全和水生态安全&#x…

Packet Tracer – 配置 VLAN

Packet Tracer – 配置 VLAN 地址分配表 设备 接口 IP 地址 子网掩码 VLAN PC1 NIC 172.17.10.21 255.255.255.0 10 PC2 NIC 172.17.20.22 255.255.255.0 20 PC3 NIC 172.17.30.23 255.255.255.0 30 PC4 NIC 172.17.10.24 255.255.255.0 10 PC5 NI…

open3d 表面重建

目录 1. create_from_point_cloud_ball_pivoting 2. create_from_point_cloud_alpha_shape 3. create_from_point_cloud_poisson 从以下效果来看,第三个方法最好。 1. create_from_point_cloud_ball_pivoting 关键代码: rec_mesh o3d.geometry.T…

面试被问麻了....

前几天组了一个软件测试面试的群,没想到效果直接拉满,看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经,感觉非常有参考价值,于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋,打开…

2022年美国大学生数学建模竞赛F题人人为我,我为人人解题全过程文档及程序

2022年美国大学生数学建模竞赛 F题 人人为我,我为人人 原题再现: 背景:   世界上大多数国家签署了1967年联合国《外层空间条约》,条约内容包括同意探索和利用外层空间,包括月球和其他天体,不论各国经济或科学发展程…

低成本挖出电商API接口-程序员要注意那些事项-技术分享

在开发电商应用的过程中,获取天猫API接口是非常必要的一步。天猫API提供了丰富的商品数据获取、订单管理、支付管理等功能,但是天猫API一般需要进行开发者认证,而认证需要企业资质和若干费用支出,这对个人开发者和小型业务开发者来…

Postgresql数组与Oracle嵌套表的使用区别

oracle中的多维数组 Oracle中常说的数组就是嵌套表,下面给出两个多维使用实例,引出和PG的差异: 一维赋值(第一行给1列) set serveroutput on; declaretype arr_num is table of number;type arr_arr_num is table o…

任务队列的Java实现

一、需求背景 当前项目中遇到这样一个需求: 将需要审核的文本提交给人工智能模型接口审核,等待模型接口审核完毕以后拿到审核结果返回给前端展示给用户(另:模型处理数据所消耗的时间会随着用户提交数据的复杂度有所变化)。 以上需…

毫米波雷达系列 | 传统CFAR检测(自适应类)

毫米波雷达系列 | 传统CFAR检测(自适应类) VI-CFAR [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dV34CKJt-1684215839850)(毫米波雷达系列 传统CFAR检测(自适应类).assets/image-20230516131206695…

Recognizing Micro-Expression in Video Clip with Adaptive Key-Frame Mining阅读笔记

本文主要贡献 据我们所知,这是第一项旨在将视频剪辑中的信息时间子集的端到端学习与单个网络中的微表情识别相结合的工作。 此外,所提出网络中所有模块的设计都与输入视频剪辑的长度无关。 换句话说,网络容忍各种长度的微表情剪辑。 本文的贡…

水利工程电子(数字)沙盘

水利工程电子(数字)沙盘利用三维地理信息系统、遥感技术、海量数据管理技术、虚拟现实技术、网络通讯技术和高性能计算机技术等现代高新信息技术,采用高精度DEM地形数据、遥感影像、航拍影像和基础地理矢量数据,建立三维空间场景&…

SAAS 与 IAAS 云渲染农场比较

渲染时,最重要的是需要的时间和硬件可用的。此渲染过程需要大量计算能力才能快速创建图像或视频。GPU(图形处理单元)是图形的计算能力,越来越多地用于渲染CAD模型。GPU中有特殊的处理器,可以执行用于快速编辑和显示图像…