import { toCartesian, toDegrees } from "./tool";
/**
* 計(jì)算實(shí)體的位置矩陣
* @param entity
* @param time
* @returns {*}
*/
export const computeModelMatrix = ({ Cesium, viewer }, entity, time) => {
let position = Cesium.Property.getValueOrUndefined(
entity.position,
time,
new Cesium.Cartesian3()
);
if (!Cesium.defined(position)) {
return undefined;
}
let orientation = Cesium.Property.getValueOrUndefined(
entity.orientation,
time,
new Cesium.Quaternion()
);
let modelMatrix;
if (!Cesium.defined(orientation)) {
modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
position,
undefined,
new Cesium.Matrix4()
);
} else {
modelMatrix = Cesium.Matrix4.fromRotationTranslation(
Cesium.Matrix3.fromQuaternion(orientation, new Cesium.Matrix3()),
position,
new Cesium.Matrix4()
);
}
return modelMatrix;
};
/**
* 計(jì)算實(shí)體的當(dāng)前旋轉(zhuǎn)狀態(tài)
* @param entity
*/
export const getEntityHPR = ({ Cesium, viewer }, entity) => {
return Cesium.Transforms.fixedFrameToHeadingPitchRoll(
computeModelMatrix(
{ Cesium, viewer },
entity,
viewer.clock.currentTime || Cesium.JulianDate.now()
)
);
};
/**
*
* @param {*} param0
* @param {*} model 實(shí)體模型
* @param {*} angle hpr
* @param {*} seconds 秒數(shù)
*/
export const model2HPR = ({ Cesium, viewer }, model, angle, seconds) => {
let modelHPR = Cesium.Transforms.fixedFrameToHeadingPitchRoll(
computeModelMatrix(
{ Cesium, viewer },
model,
viewer.clock.currentTime || Cesium.JulianDate.now()
)
);
let startHPR = {
heading: Cesium.Math.toDegrees(modelHPR.heading),
pitch: Cesium.Math.toDegrees(modelHPR.pitch),
roll: Cesium.Math.toDegrees(modelHPR.roll),
},
endHPR = {
heading: Cesium.Math.toDegrees(
modelHPR.heading + Cesium.Math.toRadians(angle.heading)
),
pitch: Cesium.Math.toDegrees(
modelHPR.pitch + Cesium.Math.toRadians(angle.pitch)
),
roll: Cesium.Math.toDegrees(
modelHPR.roll + Cesium.Math.toRadians(angle.roll)
),
};
modelRotate({ Cesium, viewer }, model, startHPR, endHPR, seconds);
};
/**
* 模型旋轉(zhuǎn)
* @param model
* @param startHpr
* @param endHpr
* @param seconds
* @param startPoint
* @param endPoint
*/
export const modelRotate = (
{ Cesium, viewer },
model,
startHpr,
endHpr,
seconds,
startPoint,
endPoint
) => {
let startQ = Cesium.Transforms.headingPitchRollQuaternion(
startPoint || getEntityPosition({ Cesium, viewer }, model),
new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(startHpr.heading),
Cesium.Math.toRadians(startHpr.pitch),
Cesium.Math.toRadians(startHpr.roll)
)
);
let stopQ = Cesium.Transforms.headingPitchRollQuaternion(
endPoint || getEntityPosition({ Cesium, viewer }, model),
new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(endHpr.heading),
Cesium.Math.toRadians(endHpr.pitch),
Cesium.Math.toRadians(endHpr.roll)
)
);
let start = viewer.clock.currentTime || Cesium.JulianDate.now();
let stop = Cesium.JulianDate.addSeconds(
start,
seconds,
new Cesium.JulianDate()
);
let stop_ = Cesium.JulianDate.addSeconds(
start,
seconds + 99999999,
new Cesium.JulianDate()
);
let sampled = new Cesium.SampledProperty(Cesium.Quaternion);
sampled.addSample(start, startQ);
sampled.addSample(stop, stopQ);
sampled.addSample(stop_, stopQ);
model.orientation = sampled;
};
/**
* 獲取當(dāng)前實(shí)體的位置
* @param entity
* @returns {*}
*/
export const getEntityPosition = ({ Cesium, viewer }, entity) => {
return (
entity.position._value ||
Cesium.Property.getValueOrUndefined(
entity.position,
viewer.clock.currentTime || Cesium.JulianDate.now(),
new Cesium.Cartesian3()
)
);
};
/**
* 模型移動(dòng)函數(shù) 米
* @param model
* @param meters
* @param seconds
*/
export const modelMove2Position = (
{ Cesium, viewer },
model,
position,
seconds
) => {
if (!model || !position || !seconds || !position.lng) {
return;
}
let modelNowPosition = toDegrees(
{ Cesium, viewer },
getEntityPosition({ Cesium, viewer }, model)
);
if (modelNowPosition && modelNowPosition.lng) {
modelMove({ Cesium, viewer }, model, modelNowPosition, position, seconds);
}
};
/**
* 模型移動(dòng)函數(shù)
* @param model
* @param startPosition 起點(diǎn)位置
* @param endPosition 終點(diǎn)位置
* @param seconds 秒數(shù)
*/
export const modelMove = (
{ Cesium, viewer },
model,
startPosition,
endPosition,
seconds
) => {
if (model) {
let p1 = {
lng: parseFloat(startPosition.lng),
lat: parseFloat(startPosition.lat),
alt: parseFloat(startPosition.alt),
};
let p2 = {
lng: parseFloat(endPosition.lng),
lat: parseFloat(endPosition.lat),
alt: parseFloat(endPosition.alt),
};
let start = viewer.clock.currentTime || Cesium.JulianDate.now();
let stop = Cesium.JulianDate.addSeconds(
start,
seconds,
new Cesium.JulianDate()
);
let stop_ = Cesium.JulianDate.addSeconds(
start,
seconds + 99999999,
new Cesium.JulianDate()
);
if (
typeof model.position !== "undefined" &&
typeof model.position.addSample !== "undefined"
) {
model.position.removeSamples(
new Cesium.TimeInterval({
start: start,
stop: stop_,
})
);
model.position.addSample(start, toCartesian({ Cesium, viewer }, p1));
model.position.addSample(stop, toCartesian({ Cesium, viewer }, p2));
model.position.addSample(stop_, toCartesian({ Cesium, viewer }, p2));
} else {
let property = new Cesium.SampledPositionProperty();
property.addSample(start, toCartesian({ Cesium, viewer }, p1));
property.addSample(stop, toCartesian({ Cesium, viewer }, p2));
property.addSample(stop_, toCartesian({ Cesium, viewer }, p2));
model.position = property;
}
}
};
Cesium glb 模型運(yùn)動(dòng)、姿態(tài)變換
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 之前整理過:《透析矩陣,由淺入深娓娓道來—高數(shù)-線性代數(shù)-矩陣》、《三維旋轉(zhuǎn)筆記:歐拉角/四元數(shù)/旋轉(zhuǎn)矩陣/軸角-...
- Cesium中常用的坐標(biāo) 1.屏幕坐標(biāo)(像素) 即二維笛卡爾平面坐標(biāo),我們通過鼠標(biāo)點(diǎn)擊直接獲取的坐標(biāo)就是屏幕坐標(biāo)了...
- glTF小模型只是Primitive 或Entity的其中一種數(shù)據(jù)類型; Cesium支持包含關(guān)鍵幀(key-fr...