在下面的帖子之后,我想将 Navisworks 相机映射回 Forge,所以向后退。
https://aps.autodesk.com/blog/map-forge-viewer-camera-back-navisworks
有谁知道怎么做吗?
从我的角度来看,我只需将三个变量从 Navisworks 导出到 Forge 即可完成此映射。我对吗 ? 在此输入图像描述 :
不确定您在哪里获得有关相机状态的第二张快照,但这是算法:
在 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
});
以下是一些相关参考资料供您参考: