WebGL:缩放到WebGL中场景中的对象并在该对象处停止

WebGL:缩放到WebGL中场景中的对象并在该对象处停止,webgl,Webgl,我们已经创建了一个WebGl应用程序,它显示包含多个对象的场景。整个场景可以在多个方向上旋转。应用程序要求用户能够放大到对象,但不能通过对象。我知道这个功能可以使用webgl框架实现,比如Three.js和SceneJs。不幸的是,我们的应用程序没有利用框架。是否有办法仅使用webgl实现此处描述的缩放功能?注意:我认为对象拾取对我们不起作用,因为用户不需要选择场景中的任何对象。谢谢你的帮助。别客气 首先,您需要知道世界空间中每个对象的大小。例如,如果一个对象的大小为10个单位,而另一个对象的大

我们已经创建了一个WebGl应用程序,它显示包含多个对象的场景。整个场景可以在多个方向上旋转。应用程序要求用户能够放大到对象,但不能通过对象。我知道这个功能可以使用webgl框架实现,比如Three.js和SceneJs。不幸的是,我们的应用程序没有利用框架。是否有办法仅使用webgl实现此处描述的缩放功能?注意:我认为对象拾取对我们不起作用,因为用户不需要选择场景中的任何对象。谢谢你的帮助。

别客气

首先,您需要知道世界空间中每个对象的大小。例如,如果一个对象的大小为10个单位,而另一个对象的大小为100个单位,则您可能希望与100个单位的对象之间的距离与10个单位的对象不同。对于世界空间,我的意思是,如果你将10个单位的物体缩放9,那么在世界空间中,它将是90个单位大,同样,如果它是10个单位,你会想要得到一个不同的距离

通常通过计算对象顶点的范围来计算对象在局部空间中的大小。只需遍历所有顶点,并跟踪x、y和z中的最小值和最大值。是否要从对象的原点获取最大值或计算实际中心点取决于您

因此,给定大小,我们可以计算出你需要走多远才能看到整个物体。对于标准透视矩阵,您可以反向操作。如果你知道你的物体有10个单位大,那么你需要把10个单位装进你的平截头体。你可能会选择14个单位(比如大小*1.4),这样物体周围就有了一些空间

我们知道屏幕上的
halfFovy
halfSizeToFit
,我们需要计算距离

sohcahtoa
tangent = opposite / adjacent
opposite = halfsizeToFitOnScreen
adjacent = distance
tangent  = Math.tan(halfFovY)
所以

tangent = sizeToFitOnScreen / distance
tangent * distance = sizeToFitOnScreen
distance = sizeToFitOnScreen / tangent
distance = sizeToFitOnScreen / Math.tan(halfFovY)
所以现在我们知道相机需要距离物体
距离。有一个距离物体
的整个球体。你在那个球体上的选择取决于你自己。假设从摄影机当前所在的位置出发,可以计算从对象到摄影机的方向

direction = normalize(cameraPos - objectPos)
现在,您可以计算该方向上的点距离

desiredCameraPosition = direction * distance
现在,或者使用一些观察功能将相机放在那里

matrix = lookAt(desiredCameraPosition, objectPosition, up)
或相机当前所在位置与新的所需位置之间的lerp

var m4=twgl.m4;
var v3=twgl.v3;
twgl.setAttributePrefix(“a”);
var gl=twgl.getWebGLContext(document.getElementById(“c”));
var programInfo=twgl.createProgramInfo(gl,[“vs”,“fs]”);
变量形状=[
twgl.primitives.createCubeBufferInfo(gl,2),
twgl.primitives.createSphereBufferInfo(gl,1,24,12),
twgl.primitives.createTruncatedConeBufferInfo(gl,1,0,2,24,1),
];
函数随机数(最小值、最大值){
返回min+Math.random()*(max-min);
}
函数easeInOut(t、开始、结束){
var c=结束-开始;
如果((t/=0.5)<1){
返回c/2*t*t+start;
}否则{
返回-c/2*((-t)*(t-2)-1)+启动;
}
}
//共同价值观
var lightWorldPosition=[1,8,-10];
var lightColor=[1,1,1,1];
var camera=m4.identity();
var view=m4.identity();
var viewProjection=m4.identity();
var targetNdx=0;
var targetTimer=0;
var zoomTimer=0;
var-eye=v3.copy([1,4,-60]);
var target=v3.copy([0,0,0]);
var-up=[0,1,0];
var zoomScale=1.4;
var zoomDuration=2;
var targetChangeInterval=3;
老眼变种;
var-oldTarget;
var newEye;
var新目标;
var tex=gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D,tex);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,2,2,0,gl.RGBA,gl.UNSIGNED_字节,新Uint8Array([
255,255,255,255,
192,192,192,255,
192,192,192,255,
255,255,255,255]));
gl.texParameteri(gl.TEXTURE\u 2D,gl.TEXTURE\u MIN\u过滤器,gl.NEAREST);
gl.texParameteri(gl.TEXTURE\u 2D,gl.TEXTURE\u MAG\u过滤器,gl.NEAREST);
var对象=[];
var-drawObjects=[];
var numObjects=100;
var baseHue=兰特(0,360);
对于(变量ii=0;ii