three.js之自定义一个正方体(网格)

news2025/3/1 9:32:44

本节主要通过自定义顶点和平面的方式,创造一个立方体。真正的开始走近three.js。


效果图

在这里插入图片描述

坐标系

坐标系支持右手定则。图中红色是x轴,绿色是y轴,蓝色是z轴
在这里插入图片描述

源码

引入的插件js【本人的csdn也有下载资源,如果打不开git可以在csdn下载】:

  • three.js
  • dat.gui.js
  • Stats.js
  • TrackballControls.js
  • SceneUtils.js
  • util.js
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<link type="text/css" rel="stylesheet" href="../css/index.css" />
		<script src="../libs/three.js"></script>
		<script src="../libs/Stats.js"></script>
		<script src="../libs/dat.gui.js"></script>
		<script src="../libs/TrackballControls.js"></script>
		<script src="../js/util/three_util.js"></script>
		<script src="../js/util/SceneUtils.js"></script>
	</head>
	<body>
		<div id="webgl-output"></div>
		<script src="../js/3.js"></script>
	</body>
</html>

3.js

var stats = initStats();
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 100);
var renderer = new THREE.WebGLRenderer();
renderer.setClearColor(new THREE.Color(0x000000));
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;

var planeGeometry = new THREE.PlaneGeometry(60, 40, 1, 1);
var planeMaterial = new THREE.MeshLambertMaterial({
	color: 0xffffff
});
var plane = new THREE.Mesh(planeGeometry, planeMaterial);
plane.receiveShadow = true;
plane.rotation.x = -0.5 * Math.PI;
plane.position.x = 0;
plane.position.y = 0;
plane.position.z = 0;
scene.add(plane);

camera.position.x = -30;
camera.position.y = 40;
camera.position.z = 30;
camera.lookAt(scene.position);

// 设置8个顶点
var vertices = [
	new THREE.Vector3(1,1,1),
	new THREE.Vector3(1,5,1),
	new THREE.Vector3(1,1,5),
	new THREE.Vector3(1,5,5),
	new THREE.Vector3(5,1,1),
	new THREE.Vector3(5,5,1),
	new THREE.Vector3(5,1,5),
	new THREE.Vector3(5,5,5)
]

// 构建立方体所需要的十二个三角形平面
var faces = [
	new THREE.Face3(0,2,1),
	new THREE.Face3(2,3,1),
	new THREE.Face3(7,3,2),
	new THREE.Face3(7,2,6),
	new THREE.Face3(5,7,6),
	new THREE.Face3(4,5,6),
	new THREE.Face3(1,5,0),
	new THREE.Face3(0,5,4),
	new THREE.Face3(5,1,3),
	new THREE.Face3(5,3,7),
	new THREE.Face3(2,0,4),
	new THREE.Face3(2,4,6)
]

var geom = new THREE.Geometry()
geom.vertices = vertices
geom.faces = faces
geom.computeFaceNormals()
// 设置两种材质,这样方便同时看颜色和骨架
var materials = [
	new THREE.MeshBasicMaterial({color: 0x000000, wireframe: true}),
	new THREE.MeshLambertMaterial({opacity: 0.6, color: 0x44ff44, transparent: true})
];
// materials这样做的原因是,除了显示绿色透明的立方体外,我还想显示一个线框。因为使用线框可以很容易地找出顶点和面的位置。
// SceneUtils是SceneUtils里的方法
var mesh = THREE.SceneUtils.createMultiMaterialObject(geom, materials);
mesh.castShadow = true;
mesh.children.forEach(function (e) {
  e.castShadow = true
});

scene.add(mesh);

var ambientLight = new THREE.AmbientLight(0x3c3c3c);
scene.add(ambientLight);

var spotLight = new THREE.SpotLight(0xffffff, 1.2, 150, 120);
spotLight.position.set(-40, 60, -10);
spotLight.castShadow = true;
scene.add(spotLight);

document.getElementById("webgl-output").appendChild(renderer.domElement);
var trackballControls = initTrackballControls(camera, renderer);
var clock = new THREE.Clock();
render();
    
function render() {
	trackballControls.update(clock.getDelta());
	stats.update();
	requestAnimationFrame(render);
	renderer.render(scene, camera);
}

注意点:

  • 通过vertices方法设置顶点,通过faces设置平面。
  • three里平面是由三角形构成的,所以我们要用三角形去拼装成一个个平面,比如我们要构建一个正方体,那么就需要定义8个顶点和12个三角形,
  • 三角形的顶点顺序是有规则的,当三个点是顺时针排列的时候,平面是面向相机的(面向相机的平面带颜色),反之则相反。(当然也可以伸出右手,让手指顺着顶点排列的顺序弯曲,这时候大拇指指向的方向就是平面的正面即有颜色的一侧。类似我们高中物理的电磁感应的右手定则一样。)
  • 示例中引用了SceneUtils.js里的createMultiMaterialObject方法,主要是为了构建一个同时支持两种材质的平面。

网格的方法

在这里插入图片描述

  • mesh.rotation.x = Math.PI * 0.4 或 mesh.rotation.set(Math.PI * 0.4, 0, 0) 或 mesh.rotation = new THREE.Vector3(Math.PI * 0.4, 0, 0)
  • mesh.position.x = 4 或 mesh.position.set(4, 0, 0) 或 mesh.position = new THREE.Vector3(Math.PI * 0.4, 0, 0)
  • mesh.scaleX = 4 或 mesh.scale = 4 或 mesh.scale.set(4, 0, 0)
  • mesh.translateX = 4或 mesh.translate.set(4, 0, 0)
  • mesh.visible = true 或 false

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

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

相关文章

AI网站汇总(免费chatgpt)(60个持续增加中)

本文总结了6大类AI工具,包括:聊天AI、绘画AI、AI提示词、图像处理、UI设计和3D设计,汇总60个AI网站,一键收藏。 目录 一、聊天AI 二、绘画AI 三、AI提示词 四、图像处理

SQL笔记(2)——MySQL的表操作与索引(收藏吃灰版)

本文详细记录如何通过命令的方式修改MySQL的表结构&#xff0c;例如新增列、删除列等&#xff1b;不止学会了&#xff0c;你还学懂了&#xff0c;收藏吃灰~ 开始之前 上一篇文章创建了一些表&#xff0c;ER图如下。本文针对score表进行操作&#xff0c;场景就是新增一个备注rem…

自动化测试面试一周拿到3个offer,只因为我记下了这个文档

目录 一、接口测试基础 二、 接口测试工具 三、自动化测试 四、自动化测试工具 五、总结 一、接口测试基础 1、公司接口测试流程是什么&#xff1f; 从开发那边获取接口设计文档、分析接口并进行用例设计、并提前录入到接口测试工具 jmeter&#xff0c;等开发那边进行…

客户关系管理小程序实战教程01-需求分析

日常企业经常需要在网上拓展业务&#xff0c;通过互联网工具来宣传自己的产品。用户在看到企业宣传的内容后&#xff0c;如果有需要就会通过各种方式联系到企业。 为了方便的跟踪这些销售的机会&#xff0c;我们开发一款企业内部销售团队使用的小程序&#xff0c;便于管理潜在…

Win11的两个实用技巧系列之磁盘分区后再恢复的方法、调高进程的优先级方法

Win11磁盘分区后怎么恢复到分区前?Win11磁盘分区后在恢复的方法 很多人不知道win11磁盘分区怎么恢复回去?今日为你们带来的文章是win11磁盘分区的恢复方法&#xff0c;还有不清楚小伙伴和小编一起去学习一下吧 有不少小伙伴在使用电脑的时候经常会根据自身需求对其进行磁盘的…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

文章目录一、开发要点1、基本设置 - 取消默认内外边距 / 取消基本样式 / 图片自适应2、外层父容器设置 - 子绝父相 / 盒子浏览器水平居中 / 设置圆角 / 设置溢出隐藏3、左右按钮设置 - 绝对定位垂直居中设置 / 使用圆角矩形设置半圆 / 文字垂直居中4、底部小圆点设置 - 绝对定位…

Web_python_template_injection(Python模块注入)

打开链接&#xff0c;提示是Python的模块注入 我们先了解一些基本概念&#xff1a; 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码的分离&#xff0c;这大大提升了开发效率&#xff0c;良好的设计也使得代码重用变得更加容…

智慧停车场解决方案,停车场导航技术怎么实现

停车场导航技术怎么实现&#xff1f;随着城市化的不断发展&#xff0c;停车场建的越来越大&#xff0c;同时也越来越复杂&#xff0c;停车、找车成为很多人感到十分头疼的问题。在这种情况下&#xff0c;一个高效的停车场电子地图应用已经成为城市交通管理中不可缺少的组成部分…

架构设计三原则

作为程序员&#xff0c;很多人都希望成为一名架构师&#xff0c;但并非简单地通过编程技能就能够达成这一目标。事实上&#xff0c;优秀的程序员和架构师之间存在一个明显的鸿沟——不确定性。 编程的本质是确定性的&#xff0c;也就是说&#xff0c;对于同一段代码&#xff0c…

【Java虚拟机】JVM类加载机制和双亲委派模型

文章目录1.JVM虚拟机类加载子系统2.双亲委派机制和JDK9模块化系统3.ClassLoader源码解读和自定义类加载器场景4.自定义ClassLoader类加载器案例实战5.不同类加载器加载同个class类1.JVM虚拟机类加载子系统 &#xff08;1&#xff09;什么是类加载子系统 是Java虚拟机的一个重…

MinIO基础教程

MinIO 1.MinIO安装 Minio 是个基于 Golang 编写的开源对象存储服务&#xff0c;存储非结构化数据&#xff0c;如&#xff1a;图片&#xff0c;视频&#xff0c;音乐等 官网地址&#xff1a;https://min.io/ 中文地址&#xff1a;http://minio.org.cn 官网文档&#xff08; …

【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【Vue】收集表单数据 过滤器

收集表单数据 收集表单数据&#xff1a; 若&#xff1a;<input type"text"/>,则v-model收集的是value值&#xff0c;用户输入的就是value值若&#xff1a;<input type"radio"/>,则v-model收集的是value值&#xff0c;且要给标签配置value值若…

树莓派与STM32(rt1064)串口通信

目录 一、树莓派通信 1、硬件连线准备 2、安装Serial和打开树莓派串口 2.1安装Serial 2.2打开树莓派串口 2.3修改串口映射关系 3、树莓派代码 4、上位机 5、运行uart.py代码进行测试 5.1 树莓派发送&#xff0c;上位机接收 5.2上位机发送&#xff0c;树莓派接收 二、…

HopeHomi脚手架(四)redis、redisson模块

项目结构 Redis RedisSpiModuleImport 基于SPI。在项目启动的时候返回待加载类名 public class RedisSpiModuleImport implements SpiEnvironmentModuleImport {Overridepublic String[] readyImportClassName() {return new String[]{RedisConfiguration.class.getName()};…

裸机配置Java环境,解决 -bash: jps: command not found

目录 配置JDK 1、第一步&#xff1a;使用yum命令查找JDK 2、第二步&#xff1a;执行安装命令 3、第三步&#xff1a;验证是否安装成功 4、第四步&#xff1a;验证是否可用 5、第五步&#xff1a;安装开发环境 6、第六步&#xff1a;配置环境变量 今天申请了公司的开发机器&…

【openGauss实战10】备份与恢复

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

视觉SLAM ch12 建图(RGB-D)

一、RGB-D稠密建图 RGB-D相机通结构光和飞行时间获取深度。 稠密重建方法&#xff1a;根据估计的相机位姿&#xff0c;将RGB-D数据转化为点云&#xff0c;然后进行拼接&#xff0c;最终得到由离散的点组成的点云地图。 在此基础上&#xff0c;如果希望估计物体的表面&#x…

Python 实验二 Python语言基础

1.运用输入输出函数编写程序&#xff0c;将华氏温度转换成摄氏温度。换算公式&#xff1a;C(F-32)*5/9,其中 C为摄氏温度&#xff0c;F为华氏温度。 Ffloat(input("请输入你要转换的华氏温度&#xff1a;")) C(F-32)*5/9 print("转换为摄氏温度为&#xff1a;&…

opencv:介绍 SIFT(尺度不变特征变换)及其使用(一)

在本章中 我们将了解 SIFT 算法的概念 我们将学习如何找到 SIFT 关键点和描述符。 理论 在过去的几章中,我们了解了一些角点检测器,如 Harris 等。它们具有旋转不变性,这意味着即使图像旋转,我们也可以找到相同的角点。这是显而易见的,因为旋转后的图像中的角点仍然是角点…