简体中文
主题
简体中文
主题
相关参考:
把 3D 内容“放到屏幕上”是可以实现的,但更准确地说,这不是单独的一条专用 API,而是通过把对象挂到相机下面来实现。
核心思路如下:
const camera = await api.getDefaultCamera();
await api.addChild(camera, obj);这样对象会跟随相机一起移动和旋转,视觉上就会更接近“固定在屏幕前方”。
如果你的目标是典型 HUD 或固定 UI,仍然更推荐:
这种方式更适合:
原因也很直接:
更适合下面这类内容:
const camera = await api.getDefaultCamera();
const obj = await api.getObject('screen-object');如果对象是你运行时创建的,也可以直接使用创建返回的句柄:
const obj = await api.createImage('/assets/tag.png');await api.addChild(camera, obj);await api.setPosition(obj, 0, 0, -2);
await api.setScale(obj, 0.5, 0.5, 0.5);这里最关键的是 z:
z 一般要放在负方向,表示放到镜头前方0,看起来越贴近屏幕x、y 则决定它在屏幕中的左右和上下位置。
例如:
// 居中偏下
await api.setPosition(obj, 0, -0.6, -2);
// 左上角附近
await api.setPosition(obj, -1.2, 0.8, -2);// 使物体始终最上层显示,取消渲染时的深度测试,以及对深度缓冲区的影响
const recursive = true; // 是否同时设置所有子节点。默认为false
await api.setGLState(obj, "depthTest", false, recursive);
await api.setGLState(obj, "depthWrite", false, recursive);iframe.addEventListener('ready', async (event) => {
const { api } = event.detail;
const camera = await api.getDefaultCamera();
const image = await api.createImage('/assets/floating-badge.png');
await api.addChild(camera, image);
await api.setPosition(image, 1.1, -0.8, -2);
await api.setScale(image, 0.35, 0.35, 0.35);
const recursive = true;
await api.setGLState(obj, "depthTest", false, recursive);
await api.setGLState(obj, "depthWrite", false, recursive);
});如果后面不想继续挂在相机下,可以移除父子关系,再重新挂回其他对象:
await api.removeChild(camera, obj);如果只是想隐藏:
await api.setObjectVisible(obj, false);虽然这种方案可以实现“贴屏”,但它仍然是 3D 坐标,不是 CSS 像素坐标。因此:
更稳妥的方式是:
这种情况下,HTML/CSS 会比 3D 方案更适合。