Threejs-07、几何体_顶点_索引_面之BufferGeome

news2024/11/19 7:43:44

一、

const gemometry = new THREE.BufferGeometry();
//创建顶点数据  ,顶点是有序的,每三个为一个顶点,逆时针为正面。
const vertices = new Float32Array([
  -1.0,-1.0,0.0,1.0,-1.0,0.0,1.0,1.0,0.0,
  1.0,1.0,0.0,-1.0,1.0,0.0,-1.0,-1.0,0.0,
])
gemometry.setAttribute("position",new THREE.BufferAttribute(vertices,3));
console.log(gemometry)

二、

// 使用索引绘制
const vertices = new Float32Array([
  -1.0,-1.0,0.0,1.0,-1.0,0.0,1.0,1.0,0.0,-1.0,1.0,0
])
gemometry.setAttribute("position",new THREE.BufferAttribute(vertices,3))
//创建索引
const indices = new Uint16Array([0,1,2,2,3,0]);
gemometry.setIndex(new THREE.BufferAttribute(indices,1));

效果

在这里插入图片描述
完整代码

<script setup>
// 导入threejs
import * as THREE from "three"
// 引入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
// 引入lil.gui
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";
// 创建场景
const scene = new THREE.Scene();
//创建相机
const camera = new THREE.PerspectiveCamera(
    800,// 视角
    window.innerWidth / window.innerHeight,
    0.1, // 近平面
    1000  // 远平面
);
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth,window.innerHeight);
document.body.appendChild(renderer.domElement);
const gemometry = new THREE.BufferGeometry();
//创建顶点数据  ,顶点是有序的,每三个为一个顶点,逆时针为正面。
// const vertices = new Float32Array([
//   -1.0,-1.0,0.0,1.0,-1.0,0.0,1.0,1.0,0.0,
//   1.0,1.0,0.0,-1.0,1.0,0.0,-1.0,-1.0,0.0,
// ])
// gemometry.setAttribute("position",new THREE.BufferAttribute(vertices,3));
// console.log(gemometry)
// 使用索引绘制
const vertices = new Float32Array([
  -1.0,-1.0,0.0,1.0,-1.0,0.0,1.0,1.0,0.0,-1.0,1.0,0
])
gemometry.setAttribute("position",new THREE.BufferAttribute(vertices,3))
//创建索引
const indices = new Uint16Array([0,1,2,2,3,0]);
gemometry.setIndex(new THREE.BufferAttribute(indices,1));


// 创建材质
const material = new THREE.MeshBasicMaterial({
  side:THREE.DoubleSide,
  color:0x00ff00,
  //wireframe:true,
});
const parentCube = new THREE.Mesh(gemometry,material);
//将网格添加到场景中
scene.add(parentCube);
//设置相机位置
camera.position.x=5;
camera.position.y=5;
camera.position.z=5;
//相机默认看向远点
camera.lookAt(0,0,0);
// 添加世界坐标辅助器
const axesHelper =  new THREE.AxesHelper(10);
scene.add(axesHelper);
// 添加轨道控制器
const controls = new OrbitControls(camera,renderer.domElement);
// 设置带阻尼的惯性
controls.enableDamping=true;
// 设置阻尼系数
controls.dampingFactor = 0.05;
// 设置自动旋转
//controls.autoRotate = true;
//渲染函数
function animate(){
    controls.update();
    requestAnimationFrame(animate);
    renderer.render(scene,camera);
}
animate();
// 监听窗口变化
window.addEventListener("resize",()=>{
  camera.aspect = window.innerWidth / window.innerHeight;
  //   更新摄像机的投影矩阵
  camera.updateProjectionMatrix();
  //   更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  //   设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio);
})
let eventObj = {
  // 全屏事件
  Fullscreen:function(){
    // 全屏
    document.body.requestFullscreen();
    console.log("全屏事件");
  },
  ExitFullscreen:function(){
    // 退出全屏
    document.exitFullscreen();
    console.log("退出全屏事件");
  }
}
// 创建GUI
const gui =  new GUI();
// 添加按钮
gui.add(eventObj,"Fullscreen").name("全屏")
gui.add(eventObj,"ExitFullscreen").name("退出全屏");
// 控制立方体位置
//gui.add(parentCube.position,"x",-5,5).name("立方体x轴的位置");
// 第二种写法
gui.add(parentCube.position,'x').min(-10).max(10).step(1).name('立方体x轴的位置');
let foder = gui.addFolder("立方体位置")
foder.add(parentCube.position,'x').min(-10).max(10).step(1).name('立方体x轴的位置');
foder.add(parentCube.position,'y').min(-10).max(10).step(1).name('立方体x轴的位置');
foder.add(parentCube.position,'z').min(-10).max(10).step(1).name('立方体x轴的位置');
// x轴改变触发事件
foder.add(parentCube.position,'z').min(-10).max(10).step(1).name('立方体x轴改变触发事件').onChange(
  (val)=>{
    console.log("立方体x轴位置",val);
  }
)
foder.add(parentCube.position,'z').min(-10).max(10).step(1).name('立方体x轴改变触发事件').onFinishChange(
  (val)=>{
    console.log("立方体x轴改变完成触发",val);
  }
)
// 设置元素是否有线框
gui.add(material,"wireframe").name("父元素线框模式");
// 设计立方体颜色改变
let colorParams = {
  cubeColor:"0xff0000"
}
gui.addColor(colorParams,"cubeColor").name("立方体颜色").onChange(
  (val)=>{
    parentCube.material.color.set(val);
  }
);
</script>
<template>
  <div></div>
</template>
<style >
*{
  margin: 0;
  padding: 0;
}
canvas{
  display: block;
  position: fixed;
  left: 0;
  top: 0;
  width: 100vw;
  height: 100vh;
}
</style>

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

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

相关文章

申办乙级幕墙设计资质:企业安全生产与环保要求

在申办乙级幕墙设计资质时&#xff0c;企业安全生产与环保要求是不可忽视的重要方面。以下是关于企业安全生产与环保要求的详细解读&#xff0c;以分点表示和归纳的方式呈现&#xff1a; 一、安全生产要求 安全生产管理制度&#xff1a;企业应建立健全安全生产管理制度&#xf…

操作系统期末复习(大题)

1. 进程调度 周转时间作业完成时刻-作业到达时刻 带权周转时间周转时间/服务时间 平均周转时间各个作业周转时间之和/作业个数 操作系统&#xff1a;周转时间和其他时间_系统为作业提供的时间-CSDN博客 2. 进程调度 3. 调度算法 4. 临界区互斥访问问题 即证明是否满足互斥&a…

hadoop和hbase对应版本关系

https://hbase.apache.org/book.html#configuration

【ai】openai-quickstart 配置pycharm工程

之前都是本地执行脚本【AI】指定python3.10安装Jupyter Lab环境为:C:\Users\zhangbin\AppData\Local\Programs\Python\Python310 参考之前创建的python工程 使用的是局部的私有的虚拟环境 pycharm给出的解释器 直接使用现有的,不new了 可以选择3.10 :可以选虚拟的:

神卓互联内网穿透:使用超简单,拿捏

神卓互联内网穿透技术是一种能够打破内网与外网之间壁垒的创新技术。它通过一系列智能的网络协议和算法&#xff0c;实现了将企业内部网络资源安全、稳定地暴露给外部网络访问。这使得无需进行复杂的网络配置和改造&#xff0c;就能轻松实现远程办公、跨地域协作等重要应用。 神…

SPME2024开幕在即,深兰科技商用清洁机器人新品推介会蓄势待发

6月5日&#xff5e;7日&#xff0c;以“跨界融合洞见未来”为主题的“2024 SPME第六届上海国际物业管理产业博览会”(以下简称“物博会”)将在上海世博展览馆举行。应主办方邀请&#xff0c;深兰科技携多款AI清洁机器人亮相本届展会&#xff0c;向来自全球各地的观展企业家、经…

怎么提取视频中的音频?这四种提取方法你肯定用的上!

怎么提取视频中的音频&#xff1f;在当今日新月异的数字时代&#xff0c;视频已跃升为信息交流的璀璨明星&#xff0c;然而&#xff0c;它的成功并非孤身一人&#xff0c;而是与音频这位不可或缺的伙伴并肩作战&#xff0c;音频不仅仅是声音的简单呈现&#xff0c;它更是情感的…

设计模式-00-简介

1、设计模式的面试题 原型设计模式 ● 1&#xff09;有请使用 UML 类图画出原型模式核心角色 ● 2&#xff09;原型设计模式的深拷贝和浅拷贝是什么&#xff0c;并写出深拷贝的两种方式的源码&#xff08;重写 clone 方法实现深拷贝、使用序列化来实现深拷贝&#xff09; ● …

一个 Clickhouse 集群磁盘损坏恢复数据的案例

通过一个故障案例&#xff0c;理解 ClickHouse 分布式机制。 作者&#xff1a;张宇&#xff0c;爱可生DBA&#xff0c;负责数据库运维和故障分析。擅长 ClickHouse、MySQL、Oracle&#xff0c;爱好骑行、AI、动漫和技术分享。 爱可生开源社区出品&#xff0c;原创内容未经授权不…

微信公众号(公众平台) 和 微信开放平台的scope的差异

微信公众号&#xff08;公众平台&#xff09; 和 微信开放平台 是两码事。 公众号&#xff08;公众平台&#xff09;获取的scope只包括两种&#xff1a;snsapi_base 和snsapi_userinfo&#xff0c;前者是静默获取&#xff0c;用户无感知&#xff1b;后者是需要用户确认同意的。…

anaconda安装和环境配置

文章目录 一、Anaconda下载1.从官网直接下载&#xff1a;2.从镜像站中下载&#xff1a; 二、Anaconda安装三、检测是否有Anaconda配置anaconda环境 四、 Anaconda创建多个python环境&#xff08;方便管理项目环境&#xff09;1.查看conda有哪些环境2.创建python3.6的环境3.激活…

写小红书文案一定要把情绪值拉满

写小红书文案一定要把情绪值拉满&#xff01;很多小伙伴不懂这句话的意思。 本文伯乐网络传媒将为你揭秘如何在小红书文案中&#xff0c;巧妙地运用情绪值&#xff0c;让每一个字都充满吸引力。 一、注意事项&#xff1a;真实与平衡的艺术 1. 保持文案的真实性&#xff0c;不…

五年跨境电商实战干货经验:爆品测出来的!

爆品确实是测出来的&#xff0c;不是单纯选出来的。我在亚马逊摸爬滚打了五年&#xff0c;深深感受到了“七分选品&#xff0c;三分运营”的重要性。不管你的产品图片、描述多么精美&#xff0c;如果不去精选和测试&#xff0c;很难保证能出单。我见过很多跨境新手在选品上卡了…

【html】如何利用HTML+CSS制作自己的印章

大家有没有尝试过用HTML和CSS制作自己的印章. 首先印章具有两个最基本的特点就是它是圆形的并且有边框 当然它还有一些其他的属性吗&#xff0c;废话不多说我们直接上源码&#xff1a; 效果图&#xff1a; 源码&#xff1a; html&#xff1a; <!DOCTYPE html> <h…

5.mongodb 备份与恢复

mongodb备份工具介绍&#xff1a; 1.mongoexport(备份)/mongoimport(恢复) mongoexport是MongoDB提供的一个工具&#xff0c;用于将数据从MongoDB实例导出到JSON或CSV格式的文件中&#xff0c;这个工具对于数据迁移、数据备份或者在不同的数据库之间同步数据非常有用 2.mongodu…

问题:关于醋酸钠的结构,下列说法错误的是() #媒体#媒体

问题&#xff1a;关于醋酸钠的结构&#xff0c;下列说法错误的是&#xff08;&#xff09; A&#xff0e;有极性键 B&#xff0e;有非极性键 C&#xff0e;是极性分子 D&#xff0e;是离子晶体 参考答案如图所示

【MySQL】复合查询+表的内外连接

复合查询表的内外连接 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单列子查询4.2多列子查询 5.在from子句中使用子查询6.合并查询7.表的内连和外连7.1内连接7.2外连接7.2.1左外连接 7.2.2右外连接 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1…

mov怎么转换mp4?关于mov转成MP4的四种方法

mov怎么转换mp4&#xff1f;在当今数字化时代&#xff0c;视频文件的格式转换是日常生活和工作中经常遇到的需求之一。而将mov格式转换为MP4格式是其中一个常见的任务。mov是由苹果公司开发的一种视频文件格式&#xff0c;通常在Mac和iOS设备上使用&#xff0c;而MP4是一种广泛…

【建议收藏】阿里巴巴1688如何打造7星产品,发布技巧

很多1688新手在问怎么打造7星产品&#xff0c;阿里1688七星产品对店铺的权重有加持作用&#xff0c;刚出来我也觉得很难打造7星产品&#xff0c;经过研究发现只有掌握到技巧&#xff0c;7星&#xff0c;真是很简单&#xff01;今天对小白商友来说&#xff0c;7个发布优化技巧&a…

携程无感验证

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…