导航:首页 > 编程语言 > threejsloadtexture

threejsloadtexture

发布时间:2023-05-14 13:01:55

⑴ three.js obj模型如何转成json 给threejs使用啊

具体实现步骤:

  1. obj转换成js:

  2. 不要打开Python.

    下载three.js。并将utilsexportersmaya
    目录下的plug-ins和scripts文件。拷贝到C:中,在maya插件管理版界面中开启权threeJsFileTranlator.py即直接在命令行运行 python convert_obj_three.py -i ... 。

⑵ ThreeJS简介

近年来web得到了快速的发展。随着HTML5的普及,网页的表现能力越来越强大。网页上已经可以做出很多复杂的动画,精美的效果。 但是,人总是贪的。那么,在此之上还能做什么呢?其中一种就是通过WebGL在网页中绘制高性能的3D图形。

OpenGL 它是最常用的跨平台图形库。
WebGL 是基于 OpenGL 设计的面向web的图形标准,提供了一系列javaScript API,通过这些API进行图形渲染将得以利用图形硬件从而获得较高性能。
Three.js 是通过对 WebGL 接口的封装与简化而形成的一个易用的图形库。
简单点的说法 threejs=three + js ,three表示3D的意思,js表示javascript的意思。那么合起来,three.js就是使用javascript 来写3D程序的意思。而javascript的计算能力因为google的V8引 擎得到了迅猛的增强,做3D程序,做服务器都没有问题。
WebGL 门槛相对较高,需要相对较多的数学知识(线性代数、解析几何)。因此,想要短时间上手 WebGL 还是挺有难度的。 Three.js WebGL 提供的接口进行了非常好的封装,简化了很多细节,大大降低了学习成本。并且,几乎没有损失 WebGL 的灵活性。
因此,从 Three.js入 手是值得推荐的,这可以让你在较短的学习后就能面对大部分需求场景。

Three.js 的入门是相对简单的,但是当我们真的去学的时候,会发现一个很尴尬的问题:相关的学习资料很少。
通常这种流行的库都有很完善的文档,很多时候跟着官方的文档或官方的入门教程学习就是最好的路线。但Three不是的,它的文档对初学者来说太过简明扼要。
不过官方提供了非常丰富的examples,几乎所有你需要的用法都在某个example中有所体现。但这些example不太适合用来入门,倒是适合入门之后的进一步学习。
这里推荐一些相对较好的教程:

当然,实际的学习过程中这些资料肯定是不太够的,遇到问题还是要自己去查资料。不过这里要提醒一下,Three.js的更新是相当频繁的,现在是r80版本,自2010年4月发布r1以来,这已经是第72个版本了(中间有的版本号跳过了)。因此,在网上找到的资料有些可能是不适合当前版本的,需要注意甄别(前面推荐的资料也都或多或少存在这样的问题)。

要在屏幕上展示3D图形,思路大体上都是这样的:
1、构建一个三维空间
Three中称之为场景(Scene)
2、选择一个观察点,并确定观察方向/角度等
Three中称之为相机(Camera)
3、在场景中添加供观察的物体
Three中的物体有很多种,包括Mesh,Line,Points等,它们都继承自Object3D类
4、将观察到的场景渲染到屏幕上的指定区域
Three中使用Renderer完成这一工作

场景是所有物体的容器,也对应着我们创建的三维世界。

Camera是三维世界中的观察者,为了观察这个世界,首先我们要描述空间中的位置。 Three中使用采用常见的右手坐标系定位。

Three中的相机有两种,分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera。

这里补充一个视景体的概念:视景体是一个几何体,只有视景体内的物体才会被我们看到,视景体之外的物体将被裁剪掉。这是为了去除不必要的运算。

正交投影相机的视景体是一个长方体,OrthographicCamera的构造函数是这样的:

Camera本身可以看作是一个点,left则表示左平面在左右方向上与Camera的距离。另外几个参数同理。于是六个参数分别定义了视景体六个面的位置。

可以近似地认为,视景体里的物体平行投影到近平面上,然后近平面上的图像被渲染到屏幕上。
2)透视投影相机

fov对应着图中的视角,是上下两面的夹角。aspect是近平面的宽高比。在加上近平面距离near,远平面距离far,就可以唯一确定这个视景体了。
透视投影相机很符合我们通常的看东西的感觉,因此大多数情况下我们都是用透视投影相机展示3D效果。

有了相机,总要看点什么吧?在场景中添加一些物体吧。
Three中供显示的物体有很多,它们都继承自Object3D类,这里我们主要看一下Mesh和Points两种。
1)Mesh
我们都知道,计算机的世界里,一条弧线是由有限个点构成的有限条线段连接得到的。线段很多时,看起来就是一条平滑的弧线了。
计算机中的三维模型也是类似的,普遍的做法是用三角形组成的网格来描述,我们把这种模型称之为Mesh模型。

geometry是它的形状,material是它的材质。
不止是Mesh,创建很多物体都要用到这两个属性。下面我们来看看这两个重要的属性。
2)Geometry
Geometry,形状,相当直观。Geometry通过存储模型用到的点集和点间关系(哪些点构成一个三角形)来达到描述物体形状的目的。
Three提供了立方体(其实是长方体)、平面(其实是长方形)、球体、圆形、圆柱、圆台等许多基本形状;
你也可以通过自己定义每个点的位置来构造形状;
对于比较复杂的形状,我们还可以通过外部的模型文件导入。
3)Material
Material,材质,这就没有形状那么直观了。
材质其实是物体表面除了形状以为所有可视属性的集合,例如色彩、纹理、光滑度、透明度、反射率、折射率、发光度。
这里讲一下材质(Material)、贴图(Map)和纹理(Texture)的关系。
材质上面已经提到了,它包括了贴图以及其它。
贴图其实是‘贴’和‘图’,它包括了图片和图片应当贴到什么位置。
纹理嘛,其实就是‘图’了。
Three提供了多种材质可供选择,能够自由地选择漫反射/镜面反射等材质。
4)Points
讲完了Mesh,我们来看看另一种Object——Points。
Points其实就是一堆点的集合,它在之前很长时间都被称为ParticleSystem(粒子系统),r68版本时更名为PointCloud,r72版本时才更名为Points。更名主要是因为,Mr.doob认为,粒子系统应当是包括粒子和相关的物理特性的处理的一套完整体系,而Three中的Points简单得多。因此最终这个类被命名为Points。
5)Light
神说:要有光!
光影效果是让画面丰富的重要因素。
Three提供了包括环境光AmbientLight、点光源PointLight、 聚光灯SpotLight、方向光DirectionalLight、半球光HemisphereLight等多种光源。
只要在场景中添加需要的光源就好了。
6)Renderer
在场景中建立了各种物体,也有了光,还有观察物体的相机,是时候把看到的东西渲染到屏幕上了。这就是Render做的事情了。
Renderer绑定一个canvas对象,并可以设置大小,默认背景颜色等属性。
调用Renderer的render函数,传入scene和camera,就可以把图像渲染到canvas中了。

现在,一个静态的画面已经可以得到了,怎么才能让它动起来?
很简单的想法,改变场景中object的位置啊角度啊各种属性,然后重新调用render函数渲染就好了。
那么重新渲染的时机怎么确定?
HTML5为我们提供了requestAnimFrame,它会自动在每次页面重绘前调用传入的函数。
如果我们一开始这样渲染:

只需要改成这样:

object就可以动起来了!

下面我们用一个简单的例子来梳理一下这个过程。
首先写一个有Canvas元素的页面吧。

下面来做Javascript的部分
首先初始化Renderer

初始化场景:

初始化相机:

要唯一确定一个相机的位置与方向,position、up、lookAt三个属性是缺一不可的。
这里我们创建了一个正交投影相机,这里我将视景体大小与屏幕分辨率保持一致只是为了方便,这样坐标系中的一个单位长度就对应屏幕的一个像素了。
我们将相机放在Z轴上,面向坐标原点,相机的上方向为Y轴方向,注意up的方向和lookAt的方向必然是垂直的(类比自己的头就知道了)。
下面添加一个立方体到场景中:

注意我们使用了法向材质 MeshNormalMaterial ,这样立方体每个面的颜色与这个面对着的方向是相关的,更便于观察/调试。
在这个简单的demo里我不打算添加光影效果,而法向材质对光也是没有反应的。 最后来创建一个动画循环吧

每次重绘都让这个立方体转动一点点。 当页面加载好时,调用前面这些函数就好了。

WebGL中文网 强烈推荐!!
WebGL中文教程网

⑶ threejs需要加载大量场景模型,需要时时清理无用模型出场景同时能够显著降低内存消耗,清除场景我

想当然的在这里意淫罢了,模型都已经加载到内存了,你给我说remove出scene就可以了?就算上你这样的思路是正确的,请问你怎么处理业务逻辑?何时加载需要的模型?光处理哪些模型加载,哪些模型何时加载就够你受的了

⑷ three.js 怎样绑定陀螺仪

three.js 绑定陀螺仪实现例子如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<script>
<div id="CanvasBody">
<input id="onDevice" type="button" value="开启陀螺仪">
</div>
<!-- 鼠标控制 (OrbitControls.js) -->
<script>
THREE.OrbitControls=function(object,domElement){return}event.preventDefault();event.stopPropagation();handleMouseWheel(event);scope.dispatchEvent(startEvent);scope.dispatchEvent(endEvent)}function onKeyDown(event){if(scope.enabled===false||scope.enableKeys===false||scope.enablePan===false){return}handleKeyDown(event)}function onTouchStart(event){if(scope.enabled===false){return}switch(event.touches.length){case 1:if(scope.enableRotate===false){return}handleTouchStartRotate(event);state=STATE.TOUCH_ROTATE;break;case 2:if(scope.enableZoom===false){return}handleTouchStartDolly(event);state=STATE.TOUCH_DOLLY;break;case 3:if(scope.enablePan===false)
</script>
<!-- 控制陀螺仪 (DeviceOrientationControls.js) -->
<!-- 代码 -->
<script>
"use strict";
(function (CanvasBody, _window) {
var Scene = void 0,
Camera = void 0,
Renderer = void 0,
FpsStats = void 0,
AnimateFrame = void 0,
Controls = void 0,
Devices = void 0;
var onDevice = document.getElementById("onDevice");
var isDeviceing = 0;
/* 初始化函数 */
function initScene() {
Scene = new THREE.Scene();
}
// 初始化照相机
function initCamera() {
Camera = new THREE.PerspectiveCamera(60, CanvasBody.clientWidth / CanvasBody.clientHeight, 1, 3000);
Camera.position.set(1, 0, 0);
Camera.lookAt({ x: 200, y: 0, z: 0 });
}
// 初始化渲染器
function initRenderer() {
Renderer = new THREE.WebGLRenderer();
Renderer.setSize(CanvasBody.clientWidth, CanvasBody.clientHeight);
Renderer.setClearColor(0x000000, 1);
CanvasBody.appendChild(Renderer.domElement);
}
// 初始化监视器
function initFpsStats() {
FpsStats = new Stats();
CanvasBody.appendChild(FpsStats.domElement);
FpsStats.domElement.style.cssText = "position: absolute;top: 0;left: 0;";
}
// 初始化控制器
function initControls() {
Controls = new THREE.OrbitControls(Camera);
}
// 初始化陀螺仪
function initDevices() {
Devices = new THREE.DeviceOrientationControls(Camera);
}
/* 窗口改变事件 */
function windowChange() {
initCamera();
Renderer.setSize(CanvasBody.clientWidth, CanvasBody.clientHeight);
initDevices();
initControls();
}
/* 控制陀螺仪 */
function controlDevice(event) {
if (isDeviceing === 0) {
isDeviceing = 1;
onDevice.value = "关闭陀螺仪";
} else {
isDeviceing = 0;
onDevice.value = "开启陀螺仪";
}
}
/* 动画 */
function animate(time) {
FpsStats.begin();
Renderer.clear();
isDeviceing === 0 ? Controls.update() : Devices.update();
Renderer.render(Scene, Camera);
FpsStats.end();
AnimateFrame = requestAnimationFrame(animate);
}
/* 初始化 */
function init() {
// 初始化
initScene();
initCamera();
initRenderer();
initFpsStats();
initControls();
initDevices();
// 初始化绑定陀螺仪
Devices.connect();
_window.addEventListener("resize", windowChange, false);
onDevice.addEventListener("click", controlDevice, false);
AnimateFrame = requestAnimationFrame(animate);
}
init();
/* 场景内物体 */
(function () {
var r = Math.sqrt(5000 * 1827 / 4 / Math.PI);
var texture = THREE.ImageUtils.loadTexture("http://cdn.attach.w3cfuns.com/notes/pics/201606/14/141100b7m85b4k8kb3337z.jpg", {}, function () {
var geometry = new THREE.SphereGeometry(r, 100, 100);
var material = new THREE.MeshLambertMaterial({
map: texture,
side: THREE.DoubleSide
});
var mesh = new THREE.Mesh(geometry, material);
Scene.add(mesh);
mesh.position.set(0, 0, 0);

var al = new THREE.AmbientLight(0xffffff);
Scene.add(al);
});
})();
})(document.getElementById("CanvasBody"), window);
</script>
</body>
</html>

⑸ 如何用threejs添加一个背景

如果你是指给场景设置背景,直接load个texture(可以是普通的texture,也可以是天空盒子那样的cubetexture),然后scene.background=texture

⑹ threejs如何让材质同时拥有高光和凹凸效果

map为默认材质色,添来加自normalMap法线贴图产生凹凸视觉, 配合roughness数值产生高光。
材质代码:
let map_d=new THREE.TextureLoader().load("常规贴图.jpg");
let map_n=new THREE.TextureLoader().load("法线贴图.jpg");
let material=new THREE.MeshStandardMaterial({
map:map_d,
normalMap:map_n,
roughness:0.1
});
let geometry = new THREE.CircleBufferGeometry( 5, 32 );
let circle = new THREE.Mesh( geometry, material );
scene.add( circle );

⑺ three.js 给模型添加标注

1. 需要有一个被选择的mesh,通过raycaster获取

2. 创建先和一个平面

3. 将线和标注的面放在获取的mesh上

var mouse =new THREE.Vector2();

var raycaster =new THREE.Raycaster();

mouse.x = (event.clientX / domElement.width) *2 -1;

mouse.y = -(event.clientY / domElement.height) *2 +1;

raycaster.setFromCamera(mouse, camera);

var intersects = raycaster.intersectObjects(scene.children, false); // 

selectedObject = intersects[0].object; // 被选中的标注对象

// 

var startP,endP;// 这里也是通过raycaster获取到的

var color = parameters.hasOwnProperty("color") ? parameters.color :0x0000ff;

 var lineMat =new THREE.LineBasicMaterial({

        "color": 0xff0000

});

var lineGeo =new THREE.Geometry();

lineGeo.vertices.push(startPos);

lineGeo.vertices.push(endPos);

var line =new THREE.Line(lineGeo, lineMat);

// 初始化一个sprite,这是一个始终面向相机的平面,

var sprite = new textSprite(这并不是一个构造函数,不想写那么多,自行去官网查看)

.......

sprite.scale.set(_spriteScale, _spriteScale, _spriteScale); // 设置的是sprite的大小派脊野

selectedObject.add(line); // 添加

line.worldToLocal(_endPos); // 设置点

sprite.position.(_endPos); // 设置sprite的位置

line.add(sprite); 添加并进行关联

注: sprite可以用于进行尘喊标注热点等操作,具体实现较为简单,同时因为也算是mesh,所以sprite可以设置texture,使用图片作为背景等,也可以野带把一个canvas,把需要的文字图片等都加入进来.

⑻ 用three.js,导入的js模型或者obj模型都是黑色的。究竟是怎么回事。

转成js格式里面之后 这个文件里面贴图文件名后缀是.JPG 要把你用的贴图后缀名也改成.JPG 或者js文件里面改成.jpg 应该就能对应上了

⑼ threejs透明贴图如何不影响内部材质

在Three.js中,如果要实现不影响内部材质的透明孙旁扰贴图,则需要对渲染器的混合模则旦式进行设置。具体操作如下:

1. 设置材质的混合模式。可以通过设置material.blending参数来完成。例如将blending设置为THREE.NormalBlending表示材质使用正常的混合模式。如果该参数设置为THREE.CustomBlending,则需要进一步设置material.blendSrc和material.blendDst参数来指定混合源和混合目启并标。

2. 通过调整渲染器的渲染顺序来避免内部材质的透明被多次覆盖。可以通过设置material.depthTest和material.depthWrite参数来实现。通常情况下,需要将这两个参数都设置为true,以确保在深度测试过程中材质的深度值得到正确的比较和保存。

3. 对于透明贴图本身,需要将其加载为一个带有alpha通道的纹理贴图,并将material.opacity属性设置为小于1的数值,以表明材质是半透明的。

综上所述,通过设置合适的混合模式、渲染顺序和透明度等参数,就可以在Three.js中实现不影响内部材质的透明贴图了。

⑽ Three.js 实现VR看房

准备工作:

1、three.js    https://threejs.org/build/three.js

2、搭建项目环境 我使用的live-server

3、720°全景图

目录结构

mian.js

; (function () {

  // 在THREEjs中,渲染一个3d世界的必要因素是场景(scene)、相机(camera)、渲染器(renderer)。渲染出一个3d世界后,可以往里面增加各种各样的物体、光源等,形成一个3d世界。

  // 创建场景

  const scene = new THREE.Scene()

  // 创建透视摄像销卜机

  // new THREE.PrespectiveCamera('视角', '指投影窗口长宽比例', '表示重距离摄像机多远的位置开始渲染', '表示距离摄像机多远的位置截止渲染');

  // 正交摄像机是一个矩形可视区域,物体只有在这个区域内才是可见的物体无论距离摄像机是远或事近,物体都会被渲染成一个大小。一般应用场景是2.5d游戏如跳一跳、机械模型

  // 透视摄像机是最常用的摄像机类型,模拟人眼的视觉,近大远小(透视)。Fov表示的是视角,Fov越大,表示眼睛睁猜斗铅得越大,离得越远,看得更多。如果是需要模拟现实,基本都是用这个相机

  const camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 1, 1000)

  // 创建ThreeJs渲染器

  const renderer = new THREE.WebGLRenderer({ antialias: true })

  // 设置渲染器场景的大小

  renderer.setSize(window.innerWidth, window.innerHeight)

  // 渲染器添加到页面

  document.body.appendChild(renderer.domElement)

  // 上面的确是把3d世界画出来了,只是没有什么东西。在three.js中,我们需要增加光源和mesh

  // mesh即是网格。在计算机里,3D世界是由点组成的,无数的面拼接成各种形状的物体。这种模型叫做网格模型。一条线是两个点组成,一个面是3个点组成,一个物体由多个3点组成的面组成

  // 而网格(mesh)又是由几何体(geometry)和材质(material)构成的

  //  我们所能想象到的几何体,框架都自带了,我们只需要调用对应的几何体构造函数即可创建。几何体的创建方法都是new,如BoxBuffer:const geometry = new THREE.BoxBufferGeometry( 1, 1, 1 );

  // 创建的时候,一般定义了渲染一个 3D 物体所需要的基本数据:Face 面、Vertex 顶点等信穗好息。THREE.xxxGeometry指的是框架自带的几何体,不同几何体所需要的参数有所不同,大概是width、height、radius、depth、segment、detail、angle等属性

  // 更多geometry相关api

  // BufferGeometry和Geometry有什么不同?就实现的效果来说它们都是一样,但是BufferGeometry的多了一些顶点属性,且性能较好。对于开发者来说,Geometry对象属性少体验更好。THREE解析几何体对象的时候,如果是Geometry,则会把对象转换成ufferGeometry对象,再进行下一步渲染

  // 创建几何模型

  // THREE.BoxGeometry('x轴长', 'y轴长', 'z轴长')

  const geometry = new THREE.SphereGeometry(50, 256, 256);

  // 创建贴图 720°图片,需要硬件支持 这里的图是借用网络上面的

  const texture = new THREE.TextureLoader().load('https://qhyxpicoss.kujiale.com/r/2019/07/01/_3000x4000.jpg?x-oss-process=image/resize,m_fill,w_1600,h_920/format,webp')

  //创建材质

  const material = new THREE.MeshBasicMaterial({ map: texture })

  // 渲染球体的双面

  material.side = THREE.DoubleSide;

  // 创建网格对象

  const mesh = new THREE.Mesh(geometry, material)

  // 网格对象填加到场景

  scene.add(mesh)

  // 摄像机放球体中心

  camera.position.set(-0.3, 0, 0)

  // 控制器(如果报错去github自己拷贝一个OrbitControls.js https://github.com/mrdoob/three.js/blob/dev/examples/js/controls/OrbitControls.js )

  const controls = new THREE.OrbitControls(camera, renderer.domElement);

  controls.addEventListener("change", () => {

    renderer.render(scene, camera);

  });

  controls.minDistance = 1;

  controls.maxDistance = 2000;

  controls.enablePan = false;

  // 调整max

  controls.minDistance = 1 // controls.maxDistance = 200;

  controls.maxDistance = 2

  function animate () {

    requestAnimationFrame(animate)

    renderer.render(scene, camera)

  }

  animate()

  window.onresize = function () {

    camera.aspect = window.innerWidth / window.innerHeight

    camera.updateProjectionMatrix()

    renderer.setSize(window.innerWidth, window.innerHeight)

  }

})()

阅读全文

与threejsloadtexture相关的资料

热点内容
怎么他么怎么又网络了 浏览:649
java会出现内存泄露么 浏览:617
苹果4s锁屏后怎么还显示歌曲 浏览:207
鸿蒙系统文件管理哪些可以删除 浏览:550
ubuntuqt创建工程没有配置文件 浏览:126
网站登录变成其他网站怎么处理 浏览:202
ug数控编程学校有哪些 浏览:203
java图片上传显示 浏览:402
ppt的文件名后缀 浏览:902
ug编程软件下载到哪个盘 浏览:359
炫酷字体APP下载的文件在哪里 浏览:668
廊坊哪里有少儿编程机构 浏览:312
cad新文件能找回来吗 浏览:951
导出手机qq文件到u盘 浏览:456
电脑如何打开ppt文件怎么打开方式 浏览:782
魅族锁定区文件夹 浏览:357
刻字cnc怎么编程 浏览:182
学校的网络拓扑结构图 浏览:784
收集100个pdf文件里关键词 浏览:594
苹果关闭4g网络设置 浏览:289

友情链接