Threejs实现VR全景/模拟krpano异步加载/局部纹理刷新/图分层加载/瓦片加载

1,功能介绍

使用 Threejs实现WebVR全景,模拟krpano异步加载、分层加载、瓦片加载、顺序加载,Threejs实现局部纹理刷新,效果如下图:

2,功能实现

Canvas纹理(CanvasTexture),从Canvas元素中创建纹理贴图。

// 创建canvas绘制内容并返回
function getCanvasDrewTile1(color) {
	let canvas = document.createElement('canvas');
	let context = canvas.getContext('2d');
	canvas.height = 1024;
	canvas.width = 1024;

	context.fillStyle = color
	context.fillRect(0, 0, 1024, 1024)

	context.lineWidth = 3;
	context.strokeStyle = "#ffffff";
	context.moveTo(100, 100)
	context.lineTo(924, 100)
	context.lineTo(924, 924)
	context.lineTo(100, 924)
	context.lineTo(100, 100)
	context.stroke()

	// 居中
	context.lineWidth = 1;
	context.fillStyle = "white";
	context.font = '40px "微软雅黑"';
	context.textAlign = "center";
	context.textBaseline = "middle";
	context.strokeText("tile_1", 512, 512);
	return canvas;
}

// 创建六面材质并返回
function getTexturesFromAtlas() {

	let materials = [];

	for (let i = 0; i < 6; i++) {
        // 创建一个纹理贴图,将其应用到一个表面,或者作为反射/折射贴图
		let texture = new THREE.Texture();
        // 贴图采样模式
		texture.minFilter = THREE.LinearFilter;
        // 贴图设置手动生成
		texture.generateMipmaps = false;

        // 基础网格材质(MeshBasicMaterial)
		let material = new THREE.MeshBasicMaterial({
			map: texture,
		})

		materials.push(material);

	}

	return materials;

}

var geometryBox = new THREE.BoxGeometry(100, 100, 100);
geometryBox.scale(1, 1, -1);

// 获取六面材质
var materialArray = getTexturesFromAtlas();
// 右,左,上,下,前,后
var color = [
	["#567bff", "#ccaa00", "#56aa21", "#9ac9d9", "#525e5e", "#dd4422"],
	[4, 1, 0, 2, 3, 5]
];

// 创建立方体物体,并添加到场景中
var geometryBoxMesh = new THREE.Mesh(geometryBox, materialArray);
scene.add(geometryBoxMesh)

// 更新每一面贴图
for (let i = 0; i < 6; i++) {
	let texture1 = new THREE.CanvasTexture(getCanvasDrewTile1(color[0][i]));

	let material = materialArray[color[1][i]];

	setTimeout(function() {
		material.map = texture1;
	}, 500 * i)
}

第二层绘制跟第一层方法一样

function getCanvasDrewTile2(color) {
	let canvas = document.createElement('canvas');
	let context = canvas.getContext('2d');
	canvas.height = 1024 / 2;
	canvas.width = 1024 / 2;

	context.fillStyle = color
	context.fillRect(0, 0, 1024 / 2, 1024 / 2)

	context.lineWidth = 3;
	context.strokeStyle = "#ffffff";
	context.moveTo(100 / 2, 100 / 2)
	context.lineTo(924 / 2, 100 / 2)
	context.lineTo(924 / 2, 924 / 2)
	context.lineTo(100 / 2, 924 / 2)
	context.lineTo(100 / 2, 100 / 2)
	context.stroke()

	// 居中
	context.lineWidth = 1;
	context.fillStyle = "white";
	context.font = '20px "微软雅黑"';
	context.textAlign = "center";
	context.textBaseline = "middle";
	context.strokeText("tile_2", 512 / 2, 512 / 2);
	return canvas;
}


// 获取渲染的起始位置
for (let i = 0; i < 6; i++) {
	let texture1 = new THREE.CanvasTexture(getCanvasDrewTile1(color[0][i]));

	let material = materialArray[color[1][i]];

	let position = new THREE.Vector2();

	let texture = new THREE.CanvasTexture(getCanvasDrewTile2(color[0][i]));

	setTimeout(function() {
		for (let j = 0; j < 2; j++) {
			for (let k = 0; k < 2; k++) {
				position.x = j * 512;
				position.y = k * 512;
				renderer.copyTextureToTexture(position, texture, material.map);
			}
		}
	}, 500 * (i + 1))
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
three.js是一个强大的JavaScript 3D库,用于创建和显示动态的3D形。它提供了一个全景框架,可以用于创建交互式的全景场景。你可以使用three.js来加载全景像、视频或者360度的立体像,并在网页上展示。 要使用three.js创建全景场景,你需要使用一个全景相机和一个球体几何体。全景相机是一种特殊的相机,它可以捕捉360度的场景。球体几何体则用于显示全景像或者视频。你可以将全景像或者视频作为纹理应用到球体上面。 以下是一个简单的使用three.js创建全景场景的代码示例: ```javascript // 创建场景 var scene = new THREE.Scene(); // 创建全景相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); // 创建渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建球体几何体 var geometry = new THREE.SphereGeometry(500, 60, 40); geometry.scale(-1, 1, 1); // 反转纹理,使其内部可见 var material = new THREE.MeshBasicMaterial({ map: new THREE.TextureLoader().load('panorama.jpg') // 加载全景像 }); var sphere = new THREE.Mesh(geometry, material); scene.add(sphere); // 设置相机位置 camera.position.set(0, 0, 0); camera.lookAt(sphere.position); // 渲染场景 function render() { requestAnimationFrame(render); renderer.render(scene, camera); } render(); ``` 在这个示例中,我们使用了`THREE.SphereGeometry`创建了一个球体几何体,并使用`THREE.MeshBasicMaterial`作为材质,加载了一个全景像作为纹理。然后我们将球体添加到场景中,并设置相机的位置和朝向。最后,我们使用渲染器将场景渲染到屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左本Web3D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值