小编use*_*481的帖子

Three.js如何使用四元数来旋转相机

在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)

javascript three.js

10
推荐指数
2
解决办法
2万
查看次数

Three.js:将3d位置转换为2d屏幕位置

我有一个位置为(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)

预先感谢.

javascript three.js

6
推荐指数
2
解决办法
2万
查看次数

Three.js 自动旋转相机以聚焦在物体上

在three.js 3D空间中,我有一些位置已知的MESH对象和一个相机对象。

我想要实现的是:当我点击一个按钮时,相机将自动旋转和缩放(改变它的位置),以便用户的视图将聚焦在所选对象上。选定对象的位置是已知的。

请给我一些关于如何做到这一点的建议?

javascript three.js

5
推荐指数
1
解决办法
7121
查看次数

Three.js更新TubeGeometry对象的网格

我正在尝试创建一个管和能够与该管交互,就像拖动鼠标来改变管的起点/终点.为此,我直接修改顶点位置值,我想在场景中更新对象

但是,我遇到了我正在使用的管对象的问题:当我更新路径点时,网格对象不会在屏幕上更新,所以看起来我无法在创建后对其进行修改.

我的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进行此操作?

three.js

5
推荐指数
1
解决办法
5306
查看次数

Python 等待多处理池中的进程完成而不关闭池或使用 map()

我有一个像下面这样的代码段

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)

这种方式有效,但看起来很奇怪。有一个更好的方法吗?

python multiprocessing

1
推荐指数
1
解决办法
9528
查看次数

标签 统计

three.js ×4

javascript ×3

multiprocessing ×1

python ×1