uniapp使用threejs-miniprogram在微信小程序加载模型

这篇具有很好参考价值的文章主要介绍了uniapp使用threejs-miniprogram在微信小程序加载模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.通过 npm 安装

npm install --save threejs-miniprogram

2.导入小程序版本的 Three.js并创建一个与 canvas 绑定的 three.js

<template>
	<canvas type="webgl" id="webgl" style="width: 100vw; height: 100vh"></canvas>
</template>
<script setup>
import { createScopedThreejs } from 'threejs-miniprogram';
import { onReady } from '@dcloudio/uni-app';

let THREE = null;
let canvas = null;

onReady(() => {
	init();
});

async function init() {
	await createThree();
}

function createThree() {
	return new Promise((resolve) => {
		uni.createSelectorQuery()
			.select('#webgl')
			.node()
			.exec((res) => {
				//canvas做动画时要用
				canvas = res[0].node;
				// 创建一个与 canvas 绑定的 three.js
				THREE = createScopedThreejs(canvas);
				resolve();
			});
	});
}
</script>

 3.创建渲染器

let renderer = null

async function init() {
	await createThree();
	createRenderer()
}

function createRenderer() {
	renderer = new THREE.WebGLRenderer();
	renderer.setSize(canvas.width, canvas.height);
}

4.创建场景,创建相机,渲染

let scene = null;
let camera = null;

async function init() {
	await createThree();
	createRenderer();
	createScene();
	createCamera();
	renderer.render(scene, camera);
}

function createScene() {
	scene = new THREE.Scene();
}

function createCamera() {
	camera = new THREE.PerspectiveCamera(75, canvas.width / canvas.height, 0.1, 1000);
	camera.position.set(400, 400, 800);
	camera.lookAt(0, 0, 0);
}

5.注册GLTF加载器,加载模型添加到场景

threejs-miniprogram/example/loaders/gltf-loader.js at master · wechat-miniprogram/threejs-miniprogram · GitHub

下载 gltf-loader.js

注册gltf-loader

import { registerGLTFLoader } from '@/utils/gltfloader.js';

async function init() {
	await createThree();
	createRenderer();
	createScene();
	createCamera();
	registerGLTFLoader(THREE)
	renderer.render(scene, camera);
}

加载模型和光源

async function init() {
	await createThree();
	createRenderer();
	createScene();
	createCamera();
	createLight();
	registerGLTFLoader(THREE);
	//glb纹理需要blob,小程序没有
	const res = await loadGLTF('http://127.0.0.1:3000/abc.gltf');
	scene.add(res);
	renderer.render(scene, camera);
}

function loadGLTF(url) {
	return new Promise((resolve, reject) => {
		new THREE.GLTFLoader().load(url, (gltf) => {
			// gltf.scene.scale.set(1, 1, 1);
			resolve(gltf.scene);
		});
	});
}

function createLight() {
	const light = new THREE.AmbientLight(0xffffff);
	scene.add(light);
}

threejs-miniprogram,uni-app,微信小程序,小程序

 6.添加控制器

threejs-miniprogram/example/test-cases/orbit.js at master · wechat-miniprogram/threejs-miniprogram · GitHub

下载 orbit.js,创建控制器

import registerOrbit from '@/utils/controls.js';

let controls = null

async function init() {
	await createThree();
	createRenderer();
	createScene();
	createCamera();
	createLight();
	registerGLTFLoader(THREE);
	//glb纹理需要blob,小程序没有
	const res = await loadGLTF('http://127.0.0.1:3000/abc.gltf');
	scene.add(res);
	renderer.render(scene, camera);
	createControls()
}

function createControls() {
	const orbits = registerOrbit(THREE);
	controls = new orbits.OrbitControls(camera, renderer.domElement);
	controls.enableDamping = true;
}

动起来

<template>
	<canvas type="webgl" id="webgl" style="width: 100vw; height: 100vh" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd"></canvas>
</template>
async function init() {
	await createThree();
	createRenderer();
	createScene();
	createCamera();
	createLight();
	registerGLTFLoader(THREE);
	//glb纹理需要blob,小程序没有
	const res = await loadGLTF('http://127.0.0.1:3000/abc.gltf');
	scene.add(res);
	renderer.render(scene, camera);
	createControls();
	animate();
}

function animate() {
	//小程序没有window.requestAnimationFrame
	canvas.requestAnimationFrame(animate);
	renderer.render(scene, camera);
	controls.update();
}

function touchMove(e) {
	controls.onTouchMove(e);
}

function touchEnd(e) {
	controls.onTouchEnd(e);
}

function touchStart(e) {
	controls.onTouchStart(e);
}

报错了

threejs-miniprogram,uni-app,微信小程序,小程序

原因是微信小程序没有addEventListener

把orbit.js的addEventListener删掉,我们手动触发

threejs-miniprogram,uni-app,微信小程序,小程序

  

 完整代码文章来源地址https://www.toymoban.com/news/detail-720065.html

<template>
	<canvas type="webgl" id="webgl" style="width: 100vw; height: 100vh" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd"></canvas>
</template>

<script setup>
import { createScopedThreejs } from 'threejs-miniprogram';
import { onReady } from '@dcloudio/uni-app';
import { registerGLTFLoader } from '@/utils/gltfloader.js';
import registerOrbit from '@/utils/controls.js';

let THREE = null;
let canvas = null;
let renderer = null;
let scene = null;
let camera = null;
let controls = null;

onReady(() => {
	init();
});

async function init() {
	await createThree();
	createRenderer();
	createScene();
	createCamera();
	createLight();
	registerGLTFLoader(THREE);
	//glb纹理需要blob,小程序没有
	const res = await loadGLTF('http://127.0.0.1:3000/abc.gltf');
	scene.add(res);
	renderer.render(scene, camera);
	createControls();
	console.log(controls);
	animate();
}

function createThree() {
	return new Promise((resolve) => {
		uni.createSelectorQuery()
			.select('#webgl')
			.node()
			.exec((res) => {
				//canvas做动画时要用
				canvas = res[0].node;
				// 创建一个与 canvas 绑定的 three.js
				THREE = createScopedThreejs(canvas);
				resolve();
			});
	});
}

function createRenderer() {
	renderer = new THREE.WebGLRenderer();
	renderer.setSize(canvas.width, canvas.height);
}

function createScene() {
	scene = new THREE.Scene();
}

function createCamera() {
	camera = new THREE.PerspectiveCamera(75, canvas.width / canvas.height, 0.1, 1000);
	camera.position.set(400, 400, 800);
	camera.lookAt(0, 0, 0);
}

function loadGLTF(url) {
	return new Promise((resolve) => {
		new THREE.GLTFLoader().load(url, (gltf) => {
			resolve(gltf.scene);
		});
	});
}

function createLight() {
	const light = new THREE.AmbientLight(0xffffff);
	scene.add(light);
}

function createControls() {
	const orbits = registerOrbit(THREE);
	controls = new orbits.OrbitControls(camera, renderer.domElement);
	controls.enableDamping = true;
}

function animate() {
	//小程序没有window.requestAnimationFrame
	canvas.requestAnimationFrame(animate);
	renderer.render(scene, camera);
	controls.update();
}

function touchMove(e) {
	controls.onTouchMove(e);
}

function touchEnd(e) {
	controls.onTouchEnd(e);
}

function touchStart(e) {
	controls.onTouchStart(e);
}
</script>

<style></style>

到了这里,关于uniapp使用threejs-miniprogram在微信小程序加载模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp项目如何运行在微信小程序模拟器上

    在HbuilderX中的小程序写完后自己一定要保存,否则会出不来效果 那么怎么让uniapp项目运行在微信小程序开发工具中呢 1 在hbuilderx中点击运行到小程序模拟器 2 然后在项目目录中会生成一个文件夹 在微信小程序开发软件中的工具安全设置打开端口 或者在微信小程序中导入项目

    2024年02月13日
    浏览(32)
  • uniapp 之 uniapp的返回事件 onBackPress 在微信小程序中不生效的问题

    使用 uniapp 开发微信小程序 页面中点击左上角的返回按钮,监听返回操作,页面返回前执行了一些操作, uniapp 页面生命周期中有 onBackPress ,因此将操作写在了 onBackPress () 页面生命周期钩子当中, H5 测试一切正常,但是微信开发工具中调试的时候发现没有执行 原因 : uniapp的onBackPre

    2024年02月11日
    浏览(29)
  • uniapp中发布为H5,在微信中自动播放音频和视频。

    uniapp中发布为H5,在微信中自动播放音频和视频。 安装微信jssdk 页面内使用: 这块最关键的就是引入jssdk!。经测试,音频自动播放效果相对稳定,兼容性也比较好。 安装微信jssdk npm install jweixin-module --save 页面内使用 经测试,ios/安卓都可以在微信浏览器中实现自动播放。如

    2024年02月08日
    浏览(31)
  • uniapp学习之【uniapp的返回事件 onBackPress 在微信小程序中不生效的问题】

    uniapp 的返回事件 onBackPress 在微信小程序中不生效的问题 场景 :页面中点击左上角的返回按钮,监听返回操作,页面返回前执行了一些操作, uniapp 页面生命周期中有 onBackPress ,因此将操作写在了 onBackPress () 页面生命周期钩子当中, H5 测试一切正常,但是微信开发工具中调试的时候

    2024年02月16日
    浏览(27)
  • vue3+uniapp在微信小程序实现一个2048小游戏

    微信小程序搜索《静远的工具箱》:偶数求和那个功能

    2024年04月12日
    浏览(38)
  • HBuilderX 开发的uniapp项目在微信开发者工具中调试运行

    第一步下载需要的开发工具: 下载HBuilderX:https://www.dcloud.io/hbuilderx.html 下载微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/nightly.html 第二步将自己在HBuilderX 开发的uniapp项目打开并保证能运行,然后点击 工具 进行配置微信开发者工具路径: 第三步打开微信开

    2024年02月11日
    浏览(32)
  • 解决 uniapp 修改uview样式,h5端生效,在微信小程序不生效。

    /deep/ 的兼容性不好,node-sass支持这个 /deep/ 。但是 node-sass 被 sass 和现代项目抛弃了。 如果项目里装了 sass 和 node-sass sass-loader会优先使用sass,sass只认识 ::v-deep 。 请根据自己的项目选择使用 ::v-deep 还是 /deep/ 。

    2024年02月03日
    浏览(30)
  • uniapp小程序console.log在微信开发者工具中不打印问题

    最近在开发一款uniapp小程序,发现console.log在微信开发者工具中不打印,但在H5页面就能够有打印输出,于是在网上寻找原因… 主要是由于vue.config.js文件中有设置发布时删除console的配置,如下: 官网参考地址:全局文件 —— vue.config.js 此时可以全局搜索 drop_console 将compres

    2024年02月10日
    浏览(51)
  • 在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果

    backdrop-filter: blur(10px); 这一行代码表示将背景进行模糊处理,模糊程度为10像素。这会导致背景内容在这个元素后面呈现模糊效果。 background-color: rgb(255 255 255 / .32); 这一行代码表示设置元素的背景颜色为白色(RGB值为0, 0, 0),并且通过/符号后面的透明度值(32%不透明度)使背

    2024年04月09日
    浏览(32)
  • 解决在HBuilderX里用uniapp引入vant后在微信小程序里没反应的问题

    在HbuilderX里创建了个uniapp的项目,但是引入vant后,在微信小程序里运行没反应 这是App.vue文件 加了@import 巴拉巴拉那些 问题就出在pages.json文件里, 当我们用快捷输入的 usingComponenets 这个,就有问题了 如果你不是这个原因,那就关了这篇文章吧 如果对你有用,点个赞呗

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包