我需要使用渲染的深度图从屏幕空间位置计算3D坐标。不幸的是,使用常规光线追踪对我来说不是一种选择,因为我要处理的单个几何图形包含大约5M张面。
所以我想我将执行以下操作:
这种工作,但是以某种方式定位点总是在物体的后面,因此我的深度计算可能有问题。
渲染深度图非常简单:
const depthTarget = new THREE.WebGLRenderTarget(w, h);
const depthMaterial = new THREE.MeshDepthMaterial({
depthPacking: THREE.RGBADepthPacking
});
// in renderloop
renderer.setClearColor(0xffffff, 1);
renderer.clear();
scene.overrideMaterial = depthMaterial;
renderer.render(scene, camera, depthTarget);
Run Code Online (Sandbox Code Playgroud)
使用以下命令在鼠标位置查找存储的颜色值:
renderer.readRenderTargetPixels(
depthTarget, x, h - y, 1, 1, rgbaBuffer
);
Run Code Online (Sandbox Code Playgroud)
并使用(从packing.glsl中的GLSL版本改编)转换回float:
const v4 = new THREE.Vector4()
const unpackDownscale = 255 / 256;
const unpackFactors = new THREE.Vector4(
unpackDownscale / (256 * 256 * 256),
unpackDownscale / (256 * 256),
unpackDownscale / 256,
unpackDownscale
); …Run Code Online (Sandbox Code Playgroud) 我有一台轨道相机,它的轨道是一个地球仪。用户可以单击地球上的几个标记,然后相机将移动到该点。
使用TweenMax这样的动画-
TweenMax.to(currentPos, 3, {
theta:targetPos.theta,
phi:targetPos.phi,
radius:targetPos.radius,
ease:Circ.easeIn,
onComplete:btnZoomComplete,
onUpdateParams:["{self}"],
onComplete:SataliteTweenComplete,
onUpdate: function(tween) {
controls.setThetaPhi(tween.target.theta, tween.target.phi, tween.target.radius);
}
});
Run Code Online (Sandbox Code Playgroud)
这很好用,但是没有考虑到达那里的最短路径。因此,它很可能经常绕地球转。
ThreeJS似乎是在一个非常奇怪的单位系统中测量角度:0、1.57(相当于90度),3.14(等于180dg),然后在3.14之后跳到-3.14,-1.57(等于270dg),然后又回到0 ...这让我大吃一惊。
例如,假设摄影机处于2.6且需要移至-2.61,此刻摄影机将对CCW进行动画处理(从2.6到-2.16),在视觉上需要对CW进行动画处理,而CW将从2.6变为3.14。 ,则-3.14,然后变为-2.61。
任何帮助,将不胜感激。
我猜有两个问题,如何弄清楚该怎么回事,然后如何从2.6-> 3.14进行动画处理,无缝跳转到-3.14-> -2.61