所以我有一个非常简单的情况,地平面基本上是y = 0的地方,我想让摄像机始终保持在地面以上。我也想要一些感觉直观(并且与触摸兼容)的好控件,我发现OrbitControls.js看起来最适合这个,也因为我可以通过设置 maxPolarAngle 来轻松限制极角对于少于或等于Math.PI / 2(四分之一转)的东西。
尽管如此,即使这样做,用户也可以在地面下平移,除非完全禁用平移(我不想这样做)。手动限制,以便y永远不会消极感到奇怪,但我认为只是忽略y轴上的任何变化,例如将第165行(panUp函数)更改为以下
panOffset.set( te[ 4 ], 0, te[ 6 ] );
panOffset.normalize();
导致了一个快速而肮脏的解决方案,可以解决我想要的问题。
但现在用户现在只能通过缩放来改变相机高度。
你能想到更好的解决方案吗?也许这个主题可以作为官方解决方案的思考,我相信我不会是唯一一个从这种解决方案中受益的人。
/ edit:我最初没有规范化偏移量矢量,导致另一个问题,现在已经改变了。
答案 0 :(得分:1)
以防有人需要答案:
您可以找到相对于控制目标的角度和摄像机的地面位置(无论高度如何)并指定maxPolarAngle。调整你的向上轴,我的是Y.在控制改变事件:
var centerPosition = controls.target.clone();
centerPosition.y = 0;
var groundPosition = camera.position.clone();
groundPosition.y = 0;
var d = (centerPosition.distanceTo(groundPosition));
var origin = new THREE.Vector2(controls.target.y,0);
var remote = new THREE.Vector2(0,d); // replace 0 with raycasted ground altitude
var angleRadians = Math.atan2(remote.y - origin.y, remote.x - origin.x);
controls.maxPolarAngle = angleRadians;
答案 1 :(得分:0)
我在让OrbitsControls.js按照我的意愿工作时遇到了问题。对我来说最有效的疗法是创建我自己的CamaraControls,它按照我的要求运行。我怀疑这不是你想要的答案,因为它涉及一些工作。您可以随时添加自己的更新函数来锁定值。
THREE.OrbitControls.clampedUpdate = function () {
THREE.OrbitControls.update.call(this);
if (this.object.position.y < 0) {
this.object.position.y = 0;
}
}
答案 2 :(得分:0)
不要掉到地下:
next(x for x in model.layers[::-1] if isinstance(x, keras.layers.Conv2D))