- 基于XR-FRAME实现AR实况导航
小程序开发实例: 1.点击“AR导航”按钮后进行跳转本页面,根据所选分类和标签,获取实时定位,在相机获取的场景中展示周边地点列表。点击地点,地图中显示地点距离及步行所需时间。 [图片] 2.选择目标地点,点击“到这去”按钮,进行AR实况场景导航。 [图片] 3.实况导航:页面显示目前地点剩余距离及所需时间,场景中显示路线及箭头标记。 [图片] 4.目标地点显示终点标记及范围圈,进入范围圈弹出提示,完成AR步行导航。 技术关键点: AR技术集成: 实现基于XR-FRAME技术的AR导航功能,包括摄像头开启、定位、周边设施识别等功能的集成和开发。定位和导航算法: 开发适用于步行导航的定位和导航算法,在步行过程中能够准确地获取当前位置并按照导航路线行进。3D引导标识开发: 引用虚拟的3D引导标识,包括转向、直行、转弯和目的地等箭头标识,在真实道路画面中能够准确显示。多种显示方式支持: 提供多种显示方式,2D地图画面和AR导航画面的切换。数字人支持:支持添加数字人进行领航。集成服务和二次开发: 支持集成服务和二次开发服务,根据需求定制功能和界面。安全性和稳定性: 良好的安全性和稳定性,能够正常运行并保护用户的隐私信息。
01-26 - xr-frame组件在iphone11 +ios16.1.1系统里闪退?
xr-frame组件在iphone11 +ios16.1.1系统里闪退
2022-12-02 - XR-frame再次打开时闪退
https://developers.weixin.qq.com/miniprogram/dev/framework/xr-frame/ 我试用了OSDMarker,大部分时候第一次进入时能正常工作,退出界面再次进入时,要么闪退,要么frame区域黑屏,在测试小程序中也是如此,请问这是xr-frame本身的问题还是环境问题?该怎么解决?
2023-01-15 - 小米14 在使用 XR-FRAME的时候,3自由度(threeDof)模式失效
小米14 在使用 XR-FRAME的时候,3自由度(threeDof)模式失效
2023-12-11 - XR-FRAME上手须知那些细节
春节假期,终于有时间研究了小程序 XR-FRAME的情况。尽管现在XR-FRAME 还是Beta 版本,但可以说这是小程序进入元宇宙的一个关键节点(希望尽快转正式)。上手入门教程和说明都十分平易近人,基本就是手把手的带入门,这个的确要赞一下。不过呢,可能这文档都比较早,之后都没怎么更新了,我就说说一下我这边入门的关键点吧。 1、真机调试,入门教程文档里忘记提到一个关键点就是需要在APP.JSON建立一个分包。 代码如下: "subpackages": [{ "root": "packageA", "pages": ["pages/cat"] }], 没这分包真机调试怎么都不能起来会报错,但预览可以调用;之前没发现这个费了我不少时间进行测试和找原因。 2、看社区不少同学问调用前置摄像头,其实就加个在xr-scene加给参数camera:Front。 代码如下: 这样就能顺利通过xr-camera进行调用了。 3、xr-frame与小程序view的通信,其实我的理解就是通过原来的view再加载xr-frame的组件应用,所以他们间可以通过父子组件进行通信,这个我没有太深入研究,就用了this.triggerEvent()完事,万幸也成功了。。 最后,一个的确没法搞掂的事情就是,video-texture加载的MP4视频死活都没声音和只能播放一段,我个人觉得因为video-texture是一个简单的视频图像渲染,没有将声音带过来,所以就没有声音了。这个目前我也没深研了,不过这个是AR的一个关键点,望尽快处理吧。最后的最后,以上是本人实战研究的一下小经验,也给后来者一点提醒吧,不用走太多弯路。
2023-01-30 - xr-frame中渲染透明视频
渲染透明视频可以通过将透明视频通道转换为灰度图的方式,利用uv将透明叠加到视频上。shader处理如下: vec4 color = texture2D(u_baseColorMap, vec2(vTextureCoord.x*0.5,vTextureCoord.y)); vec4 colora = texture2D(u_baseColorMap, vec2(vTextureCoord.x*0.5 + 0.5,vTextureCoord.y)); vec4 baseColor = vec4(color.xyz,colora.x); gl_FragData[0] = baseColor; 具体代码: const xrFrameSystem = wx.getXrFrameSystem(); function createVideoTsbsEffect(scene) { return scene.createEffect( { "name": "video-tsbs", "properties": [ { "key": "u_baseColorFactor", "type": 3, "default": [1, 1, 1, 0] } ], "images": [{ "key": "u_baseColorMap", "default": "white", "macro": "WX_USE_BASECOLORMAP" }], "defaultRenderQueue": 3000, "passes": [ { "renderStates": { "cullOn": true, "blendOn": true, "depthWrite": true, "cullFace": 2 }, "lightMode": "ForwardBase", "useMaterialRenderStates": true, "shaders": [0, 1] }], "shaders": [ `#version 100 precision highp float; attribute vec3 a_position; attribute vec2 a_texCoord; uniform mat4 u_projection; uniform mat4 u_world; uniform mat4 u_view; varying highp vec2 vTextureCoord; void main() { vTextureCoord = a_texCoord; gl_Position = u_projection * u_view * u_world * vec4(a_position,1.0); }`, `#version 100 precision highp float; uniform highp vec4 u_baseColorFactor; #ifdef WX_USE_BASECOLORMAP uniform sampler2D u_baseColorMap; #endif varying highp vec2 vTextureCoord; void main() { #ifdef WX_USE_BASECOLORMAP vec4 color = texture2D(u_baseColorMap, vec2(vTextureCoord.x*0.5,vTextureCoord.y)); vec4 colora = texture2D(u_baseColorMap, vec2(vTextureCoord.x*0.5 + 0.5,vTextureCoord.y)); vec4 baseColor = vec4(color.xyz,colora.x); #else vec4 baseColor = u_baseColorFactor; #endif gl_FragData[0] = baseColor; } `] } ) } xrFrameSystem.registerEffect("video-tsbs", createVideoTsbsEffect); wxml: <xr-scene bind:ready="handleReady"> <xr-assets> <xr-asset-load type="texture" asset-id="waifu" src="https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/waifu.png" /> <xr-asset-load type="video-texture" asset-id="test" src="https://demo.uality.cn/output-lr.mp4" options="autoPlay:true,loop:true" /> <xr-asset-material asset-id="video-tsbs-mat" effect="video-tsbs" uniforms="u_baseColorMap:video-test" /> </xr-assets> <xr-mesh node-id="cube" geometry="cube" material="video-tsbs-mat" /> <xr-camera clear-color="0.4 0.8 0.6 1" position="0 1 4" target="cube" camera-orbit-control /> </xr-scene> 视频生成: 通过ffmpeg生成将带有透明通道的mov格式视频转换为左(rgb通道信息)右(alpha通道信息)的MP4视频。 ffmpeg -i input.mov -vf "split [a], pad=iw*2:ih [b], [a] alphaextract, [b] overlay=w" -y output-lr.mp4 也可以用百度小程序“AFX透明视频”带的工具制作。(左右的话,直接修改shader的偏移就可以了) 转换出来的视频结果如下图: [图片]
2023-04-07 - 一个组件解决隐私授权:小程序用户隐私保护授权弹窗组件
项目链接:https://github.com/94xy/miniprogram-privacy 效果预览: [图片] 使用方法: 1、复制项目 [代码]component[代码] 文件夹中的 [代码]privacy[代码] 文件夹到小程序项目中的组件目录; 2 、在 page.json 中引入组件 { "usingComponents": { "Privacy": "/component/privacy/privacy" } } 3 、在 page.wxml 中使用组件,需要授权显示弹窗,不需要不显示 <Privacy /> 4 、可以在所有使用了隐私接口的页面都加上该组件,授权一次之后使用所有隐私接口不再需要授权 跳过阅读: 可以不阅读就点击“同意”按钮 <Privacy skipRead="{{true}}" /> 流程: 页面显示时使用 wx.getPrivacySetting 接口查询是否需要授权,需要授权则显示组件;用户点击“拒绝”直接退出小程序,用户点击“同意”关闭弹窗并同步给微信,之后可以正常使用所有隐私接口。 注意事项: 2023 年 9 月 15 号之前,默认不会启用隐私相关功能,所以检测不到需要弹窗的情况,可以在 app.json 中配置 "__usePrivacyCheck__": true 之后,接口才可以检测到是否需要弹窗。个人实际情况:我在开发者工具中配置了 "__usePrivacyCheck__": true ,needAuthorization 无论如何返回的都是 false,但在真机模拟的情况下可以返回 true自动打开隐私保护指引界面需在「小程序管理后台」配置《小程序用户隐私保护指引》,官方用户隐私保护指引填写说明。 取消授权: 微信中「微信下拉-最近-最近使用的小程序」中删除小程序可取消授权。 开发者工具中「清除模拟器缓存-清除授权数据」可取消授权。
2023-08-28