在Three.js中,我想使用THREE.quaternion使相机对象旋转到所选对象.
我确实在网上搜索,但没有找到关于如何使用这个四元数类的示例/演示或文档.
我试试以下代码:
camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
camera.position.y = 10;
camera.position.z = 0;
camera.position.x = radious;
camera.useQuaternion = true;
// I did use the TrackballTrackballControls. Maybe it causes the problem so I put it here
controls = new THREE.TrackballControls( camera, document.getElementById(_canvasElement) );
// function to make the camera rotate to the object
function focusOn3DObject(obj){
obj.useQuaternion = true;
obj.quaternion = new THREE.Quaternion(obj.position.x, obj.position.y, obj.position.z, 1);
var newQuaternion = new THREE.Quaternion();
THREE.Quaternion.slerp(camera.quaternion, obj.quaternion, newQuaternion, 0.07); …
Run Code Online (Sandbox Code Playgroud) 我有一个位置为(x,y,z)的3D对象.如何计算该对象的屏幕位置(x,y)?
我已经找到了它,一个解决方案是我必须找出投影矩阵然后将3D位置点乘以该矩阵以将其投影到某个2D观察表面(计算机屏幕)上.但我不知道如何在Three.js中找到这个矩阵.
我尝试这样的转换函数,但它给出了错误的结果
function Point3DToScreen2D(point3D){
var screenX = 0;
var screenY = 0;
var inputX = point3D.x - camera.position.x;
var inputY = point3D.y - camera.position.y;
var inputZ = point3D.z - camera.position.z;
var aspectRatio = renderer.domElement.width / renderer.domElement.height;
screenX = inputX / (-inputZ * Math.tan(camera.fov/2));
screenY = (inputY * aspectRatio) / (-inputZ * Math.tan(camera.fov / 2));
screenX = screenX * renderer.domElement.width;
screenY = renderer.domElement.height * (1-screenY);
return {x: screenX, y: screenY};
}
Run Code Online (Sandbox Code Playgroud)
预先感谢.
在three.js 3D空间中,我有一些位置已知的MESH对象和一个相机对象。
我想要实现的是:当我点击一个按钮时,相机将自动旋转和缩放(改变它的位置),以便用户的视图将聚焦在所选对象上。选定对象的位置是已知的。
请给我一些关于如何做到这一点的建议?
我正在尝试创建一个管和能够与该管交互,就像拖动鼠标来改变管的起点/终点.为此,我直接修改顶点位置值,我想在场景中更新对象
但是,我遇到了我正在使用的管对象的问题:当我更新路径点时,网格对象不会在屏幕上更新,所以看起来我无法在创建后对其进行修改.
我的3d对象创建大致如下:
var curve = new THREE.SplineCurve3([new THREE.Vector3(x, y, z), new THREE.Vector3(x2, y2, z2)]);
var geometry = new THREE.TubeGeometry(curve, segments, 2, radiusSegments, closed);
geometry.dynamic = true;
var tubeMesh = THREE.SceneUtils.createMultiMaterialObject(geometry, [new THREE.MeshBasicMaterial({color: 0xffffff, opacity: 1, transparent: true})]);
scene.add(tubeMesh);
Run Code Online (Sandbox Code Playgroud)
当我想更新积分时.我是这样做的:
tubeMesh.children[0].geometry.path.points[0] = new THREE.Vector3(x4, y4, z4));
tubeMesh.children[0].geometry.path.points[1] = new THREE.Vector3(x3, y3, z3));
tubeMesh.children[0].geometry.verticesNeedUpdate = true;
Run Code Online (Sandbox Code Playgroud)
但是,当我进行更改时,对象似乎不会在屏幕上更新.是否可以使用Tube进行此操作?
我有一个像下面这样的代码段
pool = multiprocessing.Pool(10)
for i in range(300):
for m in range(500):
data = do_some_calculation(resource)
pool.apply_async(paralized_func, data, call_back=update_resource)
# need to wait for all processes finish
# {...}
# Summarize resource
do_something_with_resource(resource)
Run Code Online (Sandbox Code Playgroud)
所以基本上我有2个循环。我在循环外初始化进程池以避免过热。在第二个循环结束时,我想总结所有过程的结果。
问题是我不能pool.map()
因为data
输入的变化而等待。我不能使用pool.join()
andpool.close()
或者因为我仍然需要pool
在第一个循环的下一次迭代中使用。
在这种情况下等待进程完成的好方法是什么?
我尝试在第二个循环结束时检查 pool._cache。
while len(process_pool._cache) > 0:
sleep(0.001)
Run Code Online (Sandbox Code Playgroud)
这种方式有效,但看起来很奇怪。有一个更好的方法吗?