three.js之scene

news2024/7/31 20:55:58

THREE.Scene对象有时被称为场景图,可以用来保存所有图形场景的必要信息。在Three.js中,这意味着THREE.Scene保存所有对象、光源和渲染所需的其他对象。
本节主要是构建一个基本场景,然后可以通过gui添加,删除场景里的对象等。


效果图

在这里插入图片描述

源码

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

  • three.js
  • dat.gui.js
  • Stats.js
  • TrackballControls.js
  • util.js[csdn链接]
  • util.js[git链接]
<!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>
	</head>
	<body>
		<div id="webgl-output"></div>
		<script src="../js/2.js"></script>
	</body>
</html>

index.css:

*{
	margin: 0;
	padding: 0;
	box-sizing: border-box;
	/* overflow: hidden; */
}
body {
	overflow: hidden;
}

2.js:

var stats = initStats();
var scene = new THREE.Scene();
// scene的雾化效果
scene.fog = new THREE.Fog(0xffffff, 0.015, 100)
//scene.fog = new THREE.FogExp2(0xffffff, 0.01)
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);

// 添加环境光
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 step = 0;

var controls = new function () {
	this.rotationSpeed = 0.02;
	this.numberOfObjects = scene.children.length;

	this.removeCube = function () {
		var allChildren = scene.children;
		var lastObject = allChildren[allChildren.length - 1];
		if (lastObject instanceof THREE.Mesh) {
			scene.remove(lastObject);
			this.numberOfObjects = scene.children.length;
		}
	};

	this.addCube = function () {

		var cubeSize = Math.ceil((Math.random() * 3));
		var cubeGeometry = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize);
		var cubeMaterial = new THREE.MeshLambertMaterial({
			color: Math.random() * 0xffffff
		});
		var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
		cube.castShadow = true;
		cube.name = "cube-" + scene.children.length;

		cube.position.x = -30 + Math.round((Math.random() * planeGeometry.parameters.width));
		cube.position.y = Math.round((Math.random() * 5));
		cube.position.z = -20 + Math.round((Math.random() * planeGeometry.parameters.height));
		cube.rotation.x += controls.rotationSpeed
		cube.rotation.y += controls.rotationSpeed
		cube.rotation.z += controls.rotationSpeed

		// add the cube to the scene
		scene.add(cube);
		this.numberOfObjects = scene.children.length;
	};

	this.outputObjects = function () {
		console.log(scene.children);
	}
};

var gui = new dat.GUI();
gui.add(controls, 'rotationSpeed', 0, 0.5);
gui.add(controls, 'addCube');
gui.add(controls, 'removeCube');
gui.add(controls, 'outputObjects');
gui.add(controls, 'numberOfObjects').listen();

var trackballControls = initTrackballControls(camera, renderer);
var clock = new THREE.Clock();


render();
function render() {
	stats.update()
	trackballControls.update(clock.getDelta())
	scene.traverse(function (e) {
	    if (e instanceof THREE.Mesh && e != plane) {
	        e.rotation.x += controls.rotationSpeed;
	        e.rotation.y += controls.rotationSpeed;
	        e.rotation.z += controls.rotationSpeed;
	    }
	});
	requestAnimationFrame(render);
	renderer.render(scene, camera);
}

// 定义 resize方法,屏幕尺寸变更时触发
window.addEventListener('resize', onResize, false)
function onResize() {
	// aspect属性,这个属性表示屏幕的长宽比
	camera.aspect = window.innerWidth / window.innerHeight
	camera.updateProjectionMatrix()
	renderer.setSize(window.innerWidth, window.innerHeight)
}

注意点:

  • 本节新引入了 ambientLight 环境光的应用;
  • scene的雾化效果scene.fog = new THREE.Fog(0xffffff, 0.015, 100),由近及远,呈线性雾化效果叠加;
  • scene的雾化效果scene.fog = new THREE.FogExp2(0xffffff, 0.01),由近到远,呈指数级增加雾化效果;
  • scene.remove 移除某个对象;
  • scene.add 添加对象;
  • scene.children 遍历场景中的对象;
  • getObjectByName(name, recursive) recursive: 递归的, 依据name查找对象,recursive为false时只查找子元素,为true是查找所有后代元素;
  • traverse(function) 可返回场景中所有元素,也可以使被调用者和其所有后代,都将执行function函数;

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

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

相关文章

lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】

一、lua变量【 全局变量和局部变量和表中的域】 Lua 变量有三种类型&#xff1a;全局变量和局部变量和表中的域。 ▪ 全局变量&#xff1a;默认情况下&#xff0c;Lua中所有的变量都是全局变量。 ▪ 局部变量&#xff1a;使用local 显式声明在函数内的变量&#xff0c;以及函数…

Golang每日一练(leetDay0040)

目录 118. 杨辉三角 Pascals Triangle &#x1f31f; 119. 杨辉三角 II Pascals Triangle II &#x1f31f; 120. 三角形最小路径和 Triangle &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/…

港联证券策略:A股市场短期预计将保持区间震荡

港联证券以为&#xff0c;跟着4月30日的接近&#xff0c;一切板块的年报以及一季度报将进入密布发表期。从历史数据来看&#xff0c;4月中旬今后指数震动调整的概率较大&#xff0c;在操作上需注意操控全体仓位。从板块方面看&#xff0c;近期为数字经济和中特估双主线驱动的行…

Adobe lr中文版下载官方版 专业摄影师的必备软件 附各个平台

说到修图软件&#xff0c;大家第一时间一定都能联想到Adobe旗下的Photoshop&#xff08;Adobe Photoshop CC&#xff09;和Lightroom&#xff08;Adobe Photoshop Lightroom CC&#xff09;&#xff0c;其中PhotoShop很多设计师都找到了对应的手机版&#xff0c;但有些用户由于…

MacOS 上安装并配置 OpenJDK 图文详细版

1、概述 1.1、什么是 OpenJDK &#xff1f; OpenJDK 是 Java 的一个开源实现&#xff0c;由 Sun Microsystems 于2006年开始发布&#xff0c;是 Java SE 平台&#xff08;Java Standard Edition&#xff09;的参考实现之一。OpenJDK 是由 GPL v2 授权下的自由软件&#xff0c…

Msray-Plus采集工具帮您快速获取数据,让您的市场营销更加精细

随着互联网的不断发展&#xff0c;数据已经成为企业竞争的重要资产之一。市场营销人员需要通过数据来了解客户需求、市场趋势和竞争对手情况&#xff0c;从而制定更加精细的市场营销策略。然而&#xff0c;采集数据并不是一件容易的事情&#xff0c;需要耗费大量的时间和精力。…

Java多线程基础学习(一)

1. 创建线程 1.1 通过构造函数&#xff1a;public Thread(Runnable target, String name){} 或&#xff1a;public Thread(Runnable target){} 示例: Thread thread1 new Thread(new MyThread(), "mythread"); class MyThread extends Thread(){public void …

天阳转债上市价格预测

天阳转债 基本信息 转债名称&#xff1a;天阳转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;9.75亿元。 正股名称&#xff1a;天阳科技&#xff0c;今日收盘价&#xff1a;15.68元&#xff0c;转股价格&#xff1a;14.92元。 当前转股价值 转债面值 / …

RHCE---服务+ansible

一、命令提示符颜色 也可以写入配置文件/etc/profile [rootmaster ~]# vim .bashrc 绿色&#xff1a; PS1\[\033[01;32m\]\u\H:\[\033[01;34m\]\w\$\[\033[00m\] 粉红色&#xff1a; PS1\[\e[1;35m\]\u\h:\[\e[0m\]\[\e[1;33m\]\w\[\e[1;35m\]\[\e[0m\]\[\e[1;34m\]\$ \[\e[0…

[架构之路-168]-《软考-系统分析师》-4-据通信与计算机网络-4/5- 常见网络设备与网络工程

目录 4 . 4 网络互连与常用设备 1 . 网络互连设备 2 . 交换技术 3 . 路由技术 4 . 5 网络工程 4.5.1 网络规划&#xff08;要做什么&#xff1f;打算怎么做&#xff1f; 什么时间做&#xff1f;&#xff09; 1 . 网络需求分析 2 . 可行性研究 3 . 对现有网络的分析与描…

【Dom获取属性操作】JavaScript 全栈体系(十)

Web APIs 第四章 操作元素属性 一、操作元素常用属性 还可以通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等语法&#xff1a; 对象.属性 值 <!DOCTYPE html> <html lang"en">&…

【c#串口通信(4)】串口调试助手的使用

前言: 关于本文中使用到的串口助手工具,订阅专栏后,加入vip群,即可在群文件免费下载 1、打开串口 1.1 选择端口号 在下图的箭头所指处,选择下拉框中你想打开的串口,因为我之前使用虚拟串口工具虚拟了COM1、COM3,所以我可以先选择COM2 1.2 设置好参数 1.2.1 波特率:…

Python数据结构与算法篇(九)--单调栈与单调队列

1 单调栈 1.1 介绍 栈&#xff08;stack&#xff09;是很简单的一种数据结构&#xff0c;先进后出的逻辑顺序&#xff0c;符合某些问题的特点&#xff0c;比如说函数调用栈。 单调栈实际上就是栈&#xff0c;只是利用了一些巧妙的逻辑&#xff0c;使得每次新元素入栈后&#x…

rhcse中配置DNS的正反向解析

实验一 正向解析 服务端ip 192.168.9.30 客户端ip 192.168.9.31 网址 www.openlab.com 安装DNS软件 服务端 [rootlocalhost ~]# yum install bind -y 客户端与服务端相同 编辑DNS主配置文件 修改其中的11和19行 listen-on port 53 { any; }; allow-query { a…

homeassistant配置MQTT集成以及传感器实体(STM32连接进入homeassistant)

大家可以看作者的小破站教学视频&#xff08;如果喜欢的话可以点个关注&#xff0c;给个三联&#xff01;啊哈哈哈哈哈哈&#xff09;&#xff1a; 【homeassistant配置MQTT集成以及传感器实体&#xff08;STM32连接进入homeassistant&#xff09;】 最近homeassistan更新之后…

Python VTK计算曲面的高斯曲率和平均曲率

introduction&#xff1a; Python VTK计算曲面的高斯曲率和平均曲率&#xff0c;如何使用户Python版本的VTK计算曲面的高斯曲率并映射在曲面上。使用了两个不同的表面&#xff0c;每个表面根据其高斯曲率和平均曲率着色. Display: Step: 本文介绍了 如何使用户Python版本的V…

什么是软件开发脚手架?为什么需要脚手架?常用的脚手架有哪些?

什么是软件开发脚手架&#xff1f;为什么需要脚手架&#xff1f;常用的脚手架有哪些&#xff1f; 微服务本身是一种架构风格&#xff0c;也是指导组织构建软件的一系列最佳实践集合。然而&#xff0c;业务团队在拆分应用后&#xff0c;会产生更多细粒度服务&#xff0c;并面临…

基于LINUX实现ping发送与接收

作用 Linux ping 命令用于检测主机&#xff1a;执行 ping 会使用 ICMP 传输协议&#xff0c;发出要求回应的信息&#xff0c;若远端主机的网络功能没有问题&#xff0c;就会回应该信息&#xff0c;因而得知该主机运作正常。 基础使用 #ping 192.168.1.1//ping 主机ip#ping -…

【项目】视频列表滑动,自动播放

自动播放 期望效果&#xff0c;当滑动列表结束后&#xff0c;屏幕中间的视频自动播放HTML页面data变量实践操作&#xff01;重点来了&#xff01;滚动获得的数据实现效果源码&#xff08;粘贴即可运行&#xff09; 期望效果&#xff0c;当滑动列表结束后&#xff0c;屏幕中间的…

C. Anna, Svyatoslav and Maps(floyd + 思维)

Problem - C - Codeforces 给你一个有n个顶点的无权图&#xff0c;以及由m个顶点的序列p1,p2,...,pm给出的路径&#xff08;该路径不一定简单&#xff09;&#xff1b;对于每个1≤i<m&#xff0c;有一个弧从pi到pi1。 如果v是p的子序列&#xff0c;v1p1&#xff0c;vkpm&a…