时间:2021-05-18
国庆8天长假,重庆之行因故未成,偶得闲,用three.js结合cannon.js写个3D小游戏耍耍。
在微信小游戏中,把three.js的3D内容在离屏画布处理,然后复制到在屏画布,方法是:
let c_toolbarHeight=140; let sysInfo=wx.getSystemInfoSync();require('./js/libs/weapp-adapter.js');var canvas_webGL=window.canvas;canvas_webGL.width = sysInfo.screenWidth * sysInfo.pixelRatio;canvas_webGL.height = (sysInfo.screenHeight-c_toolbarHeight) * sysInfo.pixelRatio;var ctx_webGL=canvas_webGL.getContext('webgl'); let options={context: ctx_webGL}let renderer = new THREE.WebGLRenderer(options);renderer.setSize(sysInfo.screenWidth, sysInfo.screenHeight-c_toolbarHeight);renderer.setPixelRatio(sysInfo.pixelRatio); function render(){ //清除canvas_bkg的3D区域 wx.tmGlobal.eraseZone(0, c_toolbarHeight, sysInfo.screenWidth, sysInfo.screenHeight); renderer.render(scene, camera); wx.tmGlobal.ctx_bkg.drawImage(canvas_webGL, 0,c_toolbarHeight*sysInfo.pixelRatio); //画一条横的红线 wx.tmGlobal.ctx_bkg.strokeStyle = '#FF8C00'; wx.tmGlobal.ctx_bkg.lineWidth = 2; wx.tmGlobal.ctx_bkg.beginPath(); wx.tmGlobal.ctx_bkg.moveTo(0, (c_toolbarHeight)*sysInfo.pixelRatio); wx.tmGlobal.ctx_bkg.lineTo( sysInfo.screenWidth*sysInfo.pixelRatio, (c_toolbarHeight)*sysInfo.pixelRatio); //画游戏结束临界线 wx.tmGlobal.ctx_bkg.moveTo(0, (c_toolbarHeight+c_yugaoHeight)*sysInfo.pixelRatio); wx.tmGlobal.ctx_bkg.lineTo( sysInfo.screenWidth*sysInfo.pixelRatio, (c_toolbarHeight+c_yugaoHeight)*sysInfo.pixelRatio); wx.tmGlobal.ctx_bkg.stroke(); //把canvas_bkg画到在屏画布 wx.tmGlobal.ctx_main.clearRect(0,0, wx.tmGlobal.canvas_main.width,wx.tmGlobal.canvas_main.height); wx.tmGlobal.ctx_main.drawImage(wx.tmGlobal.canvas_bkg,0,0);}在vivo和iphone手机都表现正常,但是,华为手机显示不出来:
https://developers.weixin.qq.com/community/develop/doc/00026c3c1c8eb010de384a82d51000?jumpto=
其它用户也提了好久了,腾讯或华为都没有解决,试来试去,终于找到了另一种写法:
renderer = new THREE.WebGLRenderer();let target = new THREE.WebGLRenderTarget( sysInfo.screenWidth*sysInfo.pixelRatio, (sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio);renderer.setRenderTarget(target);gl=renderer.getContext();var canvas_huawei=wx.createCanvas();canvas_huawei.width=sysInfo.screenWidth*sysInfo.pixelRatio;canvas_huawei.height=(sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio;var ctx_huawei=canvas_huawei.getContext('2d');var canvas_huawei2=wx.createCanvas();canvas_huawei2.width=sysInfo.screenWidth*sysInfo.pixelRatio;canvas_huawei2.height=(sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio;var ctx_huawei2=canvas_huawei2.getContext('2d');var imageData = ctx_huawei.createImageData( sysInfo.screenWidth*sysInfo.pixelRatio, (sysInfo.screenHeight-c_toolbarHeight)*sysInfo.pixelRatio);var pixels = new Uint8Array(imageData.data.length);function render(){ //擦除背景画布的webGL区域(因为webGL是用的透明绘制) wx.tmGlobal.eraseZone(0, c_toolbarHeight, sysInfo.screenWidth, sysInfo.screenHeight); renderer.render(scene, camera); gl.readPixels( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA,gl.UNSIGNED_BYTE,pixels); imageData.data.set(pixels); ctx_huawei.putImageData(imageData,0,0); //清除 ctx_huawei2.clearRect(0,0,canvas_huawei2.width,canvas_huawei2.height); //上下镜像翻转 ctx_huawei2.translate(0,canvas_huawei2.height); ctx_huawei2.scale(1, -1); ctx_huawei2.drawImage(canvas_huawei,0,0); //恢复 ctx_huawei2.translate(0,canvas_huawei2.height); ctx_huawei2.scale(1, -1); wx.tmGlobal.ctx_bkg.drawImage(canvas_huawei2, 0,c_toolbarHeight*sysInfo.pixelRatio); ......}到此这篇关于微信小游戏中three.js离屏画布的示例代码的文章就介绍到这了,更多相关微信小游戏three.js离屏画布内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
vue中安装Three.js近来无聊顺便研究一些关于3D图形化库。three.js是JavaScript编写的WebGL第三方库。Three.js是一款运行在浏
three.js里的很多对象都有一个needsUpdate属性,文档中很少有写(不过three.js的文档本来就没多少,很多问题还得靠github上的issue
Three.js引擎的优势。相对于传统的Web3D技术,以WebGL为支撑的Three.js引擎具有以下优势:1)无须插件。可以直接支持3D图形的GPU硬件加速
微信堆一堆游戏是一款微信小程序上全新上线的通天塔类小游戏,这款堆一堆游戏以刺客信条为IP打造,玩家在微信堆一堆游戏中需要尽可能的将塔堆的更高,微信堆一堆游戏玩法
前言本文主要给大家介绍了关于利用Three.js绘制字体模型的相关内容,使用three.js绘制字体模型,没有想象当中那么难。下面话不多说了,来一起看看详细的介