three.js学习 11 - threejs常用几何体,与几何体材质如何自定义

news2025/1/19 11:24:32

1.缓冲几何体(立方体)

官网API地址:https://www.three3d.cn/docs/index.html?q=geometry#api/zh/geometries/BoxGeometry
缓冲体

2.圆缓冲几何体

官网地址:https://www.three3d.cn/docs/index.html?q=geometry#api/zh/geometries/CircleGeometry
在这里插入图片描述

3.圆锥

官网地址:https://www.three3d.cn/docs/index.html?q=geometry#api/zh/geometries/ConeGeometry

4.如何在官网中搜索API提供的全部几何体参数:

顺着找

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

// 导入纹理  纹理加载器
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)

在这里插入图片描述

6. 单页面完整代码:

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)

// 添加物体
// 创建一个几何体对象
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/527971.html

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

相关文章

ppt怎么压缩文件大小?试试这几种方法

ppt怎么压缩文件大小? PPT,也就是Microsoft PowerPoint演示文稿,是一种用于创建和展示演示文稿的软件工具。PPT的作用非常广泛。它可以用于各种场景中,以呈现信息、表达观点和传递思想。PPT可以将文字、图片、图表、动画等多种媒体…

程序员之间拉开差距最大的因素

本文为小红花技术领袖俱乐部创始人赖勇浩为《编程卓越之道》(卷1)所作序言。 拿到新一版《编程卓越之道》的第一卷《深入理解计算机》的稿子,心里非常感慨:上次读这本书,已经是16年前,还留下了幼稚的读后感…

1072. 按列翻转得到最大值等行数(leetcode,哈希)-------------------c++实现

1072. 按列翻转得到最大值等行数(leetcode,哈希)-------------------c实现 题目表述 给定 m x n 矩阵 matrix 。 你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 …

排序算法之基数排序

一、基数排序(RadixSort) 基数排序(Radix sort)是一种非比较型整数排序算法。 1. 基本思想 原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序的方式可以采用LSD(Least significant…

超详细:阿里云服务器安装宝塔面板教程(需要开端口)

使用阿里云服务器安装宝塔面板教程,阿里云服务器网以CentOS操作系统为例,安装宝塔Linux面板,先远程连接到云服务器,然后执行宝塔面板安装命令,系统会自动安装宝塔面板,安装完成后会返回面板地址、账号和密码…

理论力学专题----拉普拉斯一龙格一楞次矢量

质量 m平方反比的有心力场 对应势能 V-k/r牛顿定律:\dot{\vec{p}}-k\frac{\vec{r}}{r^3} 空间旋转对称群 略 下学期学完了补上 LRL矢量 LRL矢量\vec{A}: define: \vec{A} \eqv \vec{p} \times \vec{L} - mk\frac{\vec{r}}{r} LRL守恒 \frac{d}{dt}(\vec{p} \…

图神经网络:(节点分类)在Cora数据集上动手实现图神经网络

文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1:GCN的复杂实现代码实操2:GCN的简单实现…

从零开始Vue3+Element Plus的后台管理系统(二)——Layout页面布局的实现

项目搭建好之后,开始写基本的布局。后台管理系统的布局3大元素:头部、侧栏、主要内容,各种布局结构相差不大,我选择了下图所示的布局,其中头部、侧栏、页签在页面中是固定的,只有主要内容容器会跟随页面滚动…

如何从计算机或 SD 卡中恢复已删除的音乐文件?

与我们中的许多人一样,您可能已经从喜爱的专辑中下载并保存了多个音乐文件以供离线收听,但如果您不小心或意外删除了这些音乐文件怎么办?不用担心,我们在这里列出了几种从计算机或 SD 卡中恢复已删除或丢失的音乐文件的方法。 您…

001+limou+Git的安装与入门

0.前言 您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章。本系列主要深入讲解有关Git的基础知识和基础使用,在文章中会结合部分Git网站上推荐的电子书《Pro Git》来对Git进行解读,意在补充书中对您“不友…

Java 面试 | RabbitMQ(2023版)

文章目录 rabbitmq1、为什么要使用rabbitmq2、rabbitmq如何确保消息发送?消息接收?3、RabbitMQ的构造4、Exchange交换器的类型5、RabbitMQ的持久化6、RabbitMQ消息发送和接收过程7、如何保证消息队列的高可用8、如何处理消息丢失的情况9、如何保证消息没有重复消费10、如何保…

Shell系统编程三剑客之----sed编辑器

目录 一:sed编辑器 1.sed编辑器概述 2.sed的工作流程 3.sed的命令格式 4.常用选项 5.常用操作 二:sed操作事例 1.查询 (1)打印内容 ​(2)打印行数 ​(3)打印特殊字符、ASCII码 &…

python爬虫简述

Python爬虫是一种自动化获取互联网数据的技术,它可以通过编写程序自动访问网站并抓取所需的数据。在本文中,我们将介绍Python爬虫的基础知识、常用库和实际应用。 一、Python爬虫的基础知识 爬虫的定义 爬虫是一种自动化获取互联网数据的技术&#xf…

屏幕录像怎么录?分享3个简单实用的方法!

案例:怎么录制电脑屏幕? 【对于我这种不太熟悉电脑的人来说,想要录制电脑屏幕十分困难。听说录制电脑屏幕,需要用到录屏工具。有没有小伙伴有好的录屏软件介绍,顺便附带一下教程!求!】 屏幕录…

【冶金轧钢、电厂 JL-8B/E集成电路电流继电器 CMOS运算 JOSEF约瑟】

JL-8B/E集成电路电流继电器名称:集成电路电流继电器型号:JL-8B/E触点容量250V5A功率消耗<5W返回系数过电流:0.90.97;欠电流:1.051.15整定范围0.03~60A 系列型号: JL-8A/E集成电路电流继电器; JL-8B/E集成电路电流继电器; JL-8A/E11-004集成电…

[离散数学]命题逻辑与推理

目录 主析取范式 主合取范式推理理论(假设前提条件为真推出的结论)真值表法直接证明法** 常用推理公式 ** 间接证明 CP规则--附加前提证明法,证明比较方便 单条件形式,提取前件间接法 归谬法 结论是单命题,取反前提引入 常用 latex 定义 主析…

Druid未授权漏洞进一步的利用

一、漏洞描述 Druid是阿里巴巴数据库出品的为监控而生的数据库连接池。并且Druid提供的监控功能包括监控SQL的执行时间、监控Web URI的请求、Session监控等。Druid本身是不存在什么漏洞的,但当开发者配置不当时就可能造成未授权访问。本文除了介绍Druid未授权漏洞之…

js 使用正则获取 html中 所有span标签

let html <p>艾迪莎测试但大家还是</p><h1>你好啊</h1><p>啊是多久啊合适的<span style"text-decoration: underline;">静安寺</span>大家哈圣诞节<span style"text-decoration: underline;">哈桑</s…

企业需要专业电子邮件地址的4大原因

专业的企业电子邮件地址具有贵公司的自定义域名&#xff0c;而不是通用的Zoho Mail 、gmail或yahoo帐户&#xff0c;例如&#xff1a;john stargardening.com 大多数初学者使用不带域名的通用免费企业电子邮件帐户&#xff0c;这不是很专业。例如&#xff1a;zhangsan2022zoho.…

从零开始Vue3+Element Plus后台管理系统(六)——状态管理Pinia和持久化

Pinia 官网&#xff1a;https://pinia.vuejs.org/zh/ Pinia 是 Vue 的专属状态管理库&#xff0c;相比Vuex更好用&#xff0c;优点不多了说官网有&#xff0c;用起来最重要&#xff01; 在应用的根部注入创建的 pinia // main.ts import { createApp } from vue import { c…