将 Navisworks 相机映射回 Forge 查看器

问题描述 投票:0回答:1

在下面的帖子之后,我想将 Navisworks 相机映射回 Forge,所以向后退。

https://aps.autodesk.com/blog/map-forge-viewer-camera-back-navisworks

有谁知道怎么做吗?

从我的角度来看,我只需将三个变量从 Navisworks 导出到 Forge 即可完成此映射。我对吗 ? 在此输入图像描述 :

autodesk-forge
1个回答
0
投票

不确定您在哪里获得有关相机状态的第二张快照,但这是算法:

在 Navisworks 插件中使用 Navisworks API:

var viewpoint = Autodesk.Navisworks.Api.Application.ActiveDocument.CurrentViewpoint.ToViewpoint();

var position = viewpoint.Position;
var focalDistance = viewpoint.HasFocalDistance ? viewpoint.FocalDistance : (viewpoint.NearPlaneDistance + viewpoint.FarPlaneDistance) * 0.5

var fov = 0;
var orthoScale = viewpoint.HeightField;
var isPerspective = (viewpoint.Projection == ViewpointProjection.Perspective);
if (isPerspective == true)
{
   fov = viewpoint.HeightField * (180 / Math.PI);
   orthoScale = 1;
}

var aspect = viewpoint.AspectRatio;
var rotation = viewpoint.Rotation;

// Convert the above to JSON like the below format
//{
//  aspect: aspect,
//  isPerspective: isPerspective,
//  fov: fov,
//  focalDistance: focalDistance,
//  position: { x: position.X, y: position.Y, z: position.Z },
//  quaternion: { a: rotation.A, b: rotation.B, c: rotation.C, D: rotation.D },
//  orthoScale: orthoScale
//}

在 APS 查看器中:

let focal = data.focalDistance;
let fov = data.fov;
let aspect = data.aspect;
let isPerspective = data.isPerspective,
let orthoScale = data.orthoScale;
let threePos = new THREE.Vector3(
    data.poistion.x,
    data.poistion.y,
    data.poistion.z,
);

let threeQN = new THREE.Quaternion(
    data.quaternion.a,
    data.quaternion.b,
    data.quaternion.c,
    data.quaternion.d,
);
 
// calculate view direction
let v1 = -2 * (threeQN.x * threeQN.z + threeQN.w * threeQN.y);
let v2 = -2 * (threeQN.y * threeQN.z - threeQN.w * threeQN.x);
let v3 = -1+ 2 * (threeQN.x * threeQN.x + threeQN.y * threeQN.y);

// calculate target
let threeTarget = new THREE.Vector3(
    threePos.x + focal * v1,
    threePos.y + focal * v2,
    threePos.z + focal * v3 
);

let model = viewer.getAllModels()[0];
let offsetMatrix = .model.getModelToViewerTransform();

let offsetPos = threePos.applyMatrix4(offsetMatrix); 
let offsetTarget = threeTarget.applyMatrix4(offsetMatrix);

// calculate up 
v1 = 2 * (threeQN.x * threeQN.y - threeQN.w * threeQN.z);
v2 = 1 - 2 * (threeQN.x*threeQN.x + threeQN.z*threeQN.z);
v3 = 2 * (threeQN.y*threeQN.z + threeQN.w*threeQN.x); 
let up = new THREE.Vector3( v1, v2, v3 );

viewer.impl.setViewFromCamera({
    aspect,
    isPerspective,
    fov,
    position: offsetPos,
    target: offsetTarget,
    up,
    orthoScale
});

以下是一些相关参考资料供您参考:

© www.soinside.com 2019 - 2024. All rights reserved.