- XR-FRAME 华为鸿蒙录制视频白屏
机型:HUAWEI Mate 30 Pro 型号:LIO-AL00 HarmonyOS: 4.0.0 在华为鸿蒙系统中,录制视频保存到相册,到相册查看视频发现,保存下来的视频为全白的,且时长不正确。
06-21 - xr-frame 渲染视频,背面不可见
使用几乎同样的方式创建图片纹理和视频纹理的材质,图片正反可见,视频只有正面可见。不确定是否是bug还是我写的有问题。 // 创建材质 const mat = scene.createMaterial( // 使用内置的 Simple 效果, Standard透明有问题 scene.assets.getAsset('effect', 'simple'), { u_baseColorMap: textureAsset, } ) mat.setRenderStates({ blendOn: true, cullOn: false, renderQueue: 2500 }) // 使用 scene.createElement(xrFrameSystem.XRMesh, { geometry: 'plane', material: material.id, uniforms: `u_baseColorMap:${texture.id}`, 'cast-shadow': true, 'receive-shadow': true, scale: `1 1 ${1 / scale}`, rotation: '90 0 0', })
05-28 - xr-frame视锥体问题,模型Mesh闪烁忽隐忽现
在xr-frame中,同样的glb模型,转动一下视角,部分Mesh就不可见了,非常影响体验。 尤其是带动画的模型,动画效果作用于Mesh之上,会使Mesh产生位移,而xr-frame的视锥体检测的是原始位置,导致会有情况看不到这些mesh。 (以上均是个人对xr-frame实现的猜测,实际情况还是需要微信大佬确认) 将模型动画停止后,转到视角会比较清晰的浮现。 [图片] [图片] 这个问题应该存在很久了,也有其他小伙伴报过,确实影响体验。 如果是视锥体问题,能否提供开关关闭此检测。 最后,我理解这种算法是为了提高性能,但是现在很多模型都会有这个问题,而在别的渲染器里都没有啥问题。
04-15 - VisionKit + xr-frame 平面识别IQOO8机型跟随严重,识别效果不佳
如题,安卓机型本身识别平面较慢,IQOO8机型更是跟随严重,使用xr-frame官方demo也是如此,基本可以认为是不可用的状态,但是在机型支持列表里,此机型支持V2。目前看只能自己再加一层机型列表来过滤效果不佳的? [图片]
02-29 - createInnerAudioContext设置属性为true时,部分安卓手机重复播放有杂音
机型: HUAWEI Mate 20 Pro 型号:LYA-TL00 操作系统:HarmonyOS 3.0.0 onReady() { this.audio = wx.createInnerAudioContext({ useWebAudioImplement: true }) this.audio.play() }, onUnload( { this.audio.destroy() } 第一次进入页面正常,第二次进入就有杂音了。
01-25 - 使用XR-Frame官方demo中的平面AR识别跟随问题
手机信息: OnePlus 9 微信版本:8.0.41 开发版 基础库: 3.1.5 现象:在Android手机上使用XR-Frame官方demo中的平面AR识别,分享后素材会有短暂的相机跟随,导致体验下滑,iOS手机上不会有此现象 利用轮询camera的position,依然无法很好的解决该问题,以下是尝试等待slam初始化的代码。 startSlamIdentifier(callback) { wx.showLoading({ title: '请移动一下手机' }) let count = 0; this.positionInterval = setInterval(() => { if (!this.camera) return; console.log('cameraPosition', this.camera.position.x, this.camera.position.y, this.camera.position.z); if (this.camera.position.x === 0 && this.camera.position.y === 0 && this.camera.position.z === 0) { count++; if (count >= 100) { clearInterval(this.positionInterval); wx.hideLoading(); wx.showModal({ title: '初始化失败', content: '您的手机有可能不支持空间定位', confirmText: '重试', cancelText: '退出', success: (res) => { if (res.confirm) { this.startSlamIdentifier(callback); } else if (res.cancel) { wx.navigateBack(); } } }) } } else if (this.showing) { clearInterval(this.positionInterval); setTimeout(() => { wx.hideLoading(); callback && callback(); }, 3000) } }, 300) }
2023-12-25 - createWorker开启useExperimentalWorker在iOS真机卡顿
API名称: wx.createWorker 开启useExperimentalWorker 手机信息: iphone13pro iOS 17.1.1 微信版本:8.0.44 基础库: 3.2.1 现象:在使用xr-frame时,获取了相机的yBuffer,uvBuffer后,传递到worker进行压缩,压缩完成后返回主线程发送请求。 在android真机上正常,在iOS真机上非常卡顿。将useExperimentalWorker关闭恢复正常。 // index function createNewWorker() { const worker = wx.createWorker('workers/index.js', { useExperimentalWorker: true }) return worker; } this.worker = createNewWorker(); // 监听worker被系统回收事件 this.worker.onProcessKilled(() => { // 重新创建一个worker this.worker = createNewWorker() }) const ArRawData = this.arSystem.getARRawData(); const uvBuffer = ArRawData.uvBuffer; const yBuffer = ArRawData.yBuffer; const width = ArRawData.width; const height = ArRawData.height; const scaleFactor = wx.getSystemInfoSync().pixelRatio; this.worker.postMessage({ type: 'yuv', data: { width, height, scaleFactor, yBuffer, uvBuffer, } }) // worker import { encode } from 'base64-arraybuffer/index'; function downscaleYUV(yData, uvData, originalWidth, originalHeight, scaleFactor) { const newWidth = Math.floor(originalWidth / scaleFactor); const newHeight = Math.floor(originalHeight / scaleFactor); const newYData = new Uint8Array(newWidth * newHeight); const newUVData = new Uint8Array(newWidth / 2 * newHeight / 2 * 2); for (let y = 0; y < newHeight; y++) { for (let x = 0; x < newWidth; x++) { const originalX = x * scaleFactor; const originalY = y * scaleFactor; const newYIndex = y * newWidth + x; const originalYIndex = originalY * originalWidth + originalX; newYData[newYIndex] = yData[originalYIndex]; // For UV channel const originalUVIndex = Math.floor(originalY / 2) * Math.floor(originalWidth / 2) + Math.floor(originalX / 2); const newUVIndex = Math.floor(y / 2) * Math.floor(newWidth / 2) + Math.floor(x / 2); newUVData[newUVIndex * 2] = uvData[originalUVIndex * 2]; newUVData[newUVIndex * 2 + 1] = uvData[originalUVIndex * 2 + 1]; } } return { newYData, newUVData, newWidth, newHeight }; } worker.onMessage(function (res) { switch(res.type) { case 'yuv': { const { width, height, yBuffer, uvBuffer, scaleFactor } = res.data; const { newYData, newUVData, newWidth, newHeight } = downscaleYUV( new Uint8Array(yBuffer), new Uint8Array(uvBuffer), width, height, scaleFactor ); worker.postMessage({ type: 'yuv_result', data: { scaleFactor, yBuffer: encode(newYData), uvBuffer: encode(newUVData), } }) } } })
2023-12-07