|
|
|
@ -62,8 +62,23 @@ let options = {
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const gamepadIndex = ref(null); // 当前手柄索引
|
|
|
|
|
const direction = ref(""); // 当前方向(上、下、左、右)
|
|
|
|
|
const DIRECTION = {
|
|
|
|
|
UP: "w",
|
|
|
|
|
DOWN: "s",
|
|
|
|
|
LEFT: "a",
|
|
|
|
|
RIGHT: "d",
|
|
|
|
|
SPEED_UP: "q",
|
|
|
|
|
SPEED_DOWN: "e",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const keyboardMap = {
|
|
|
|
|
[DIRECTION.UP]: false,
|
|
|
|
|
[DIRECTION.DOWN]: false,
|
|
|
|
|
[DIRECTION.LEFT]: false,
|
|
|
|
|
[DIRECTION.RIGHT]: false,
|
|
|
|
|
[DIRECTION.SPEED_UP]: false,
|
|
|
|
|
[DIRECTION.SPEED_DOWN]: false,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let map = null;
|
|
|
|
|
let Cesium = {};
|
|
|
|
@ -93,164 +108,146 @@ const mapLoad = (mapInstance) => {
|
|
|
|
|
allowDrillPick: true, // 如果存在坐标完全相同的图标点,可以打开该属性,click事件通过graphics判断
|
|
|
|
|
});
|
|
|
|
|
map.addLayer(mapLayer.markerLayer);
|
|
|
|
|
onAddGamepadboardListener()
|
|
|
|
|
|
|
|
|
|
boostrapUav();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 监听游戏手柄
|
|
|
|
|
*/
|
|
|
|
|
const onAddGamepadboardListener =()=>{
|
|
|
|
|
window.addEventListener('gamepadconnected', function (e) {
|
|
|
|
|
var gp = navigator.getGamepads()[e.gamepad.index]
|
|
|
|
|
console.log(gp, '链接')
|
|
|
|
|
})
|
|
|
|
|
// 监听游戏手柄拔出
|
|
|
|
|
window.addEventListener('gamepaddisconnected', function (e) {
|
|
|
|
|
clearInterval(interval)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建模型对象
|
|
|
|
|
*/
|
|
|
|
|
const initModel = () => {
|
|
|
|
|
const position = Cesium.Cartesian3.fromDegrees(120.734077, 31.162232, 2000)
|
|
|
|
|
|
|
|
|
|
uav = new mars3d.graphic.Route({
|
|
|
|
|
id:"uav",
|
|
|
|
|
name:"无人机模型",
|
|
|
|
|
position:position,
|
|
|
|
|
model:{
|
|
|
|
|
id: "uav",
|
|
|
|
|
name: "无人机模型",
|
|
|
|
|
|
|
|
|
|
model: {
|
|
|
|
|
url: "https://data.mars3d.cn/gltf/mars/wrj.glb",
|
|
|
|
|
scale: 5,
|
|
|
|
|
minimumPixelSize: 50,
|
|
|
|
|
// heading:220
|
|
|
|
|
scale: 5,
|
|
|
|
|
minimumPixelSize: 50,
|
|
|
|
|
runAnimations: true,
|
|
|
|
|
mergeOrientation: true,
|
|
|
|
|
},
|
|
|
|
|
camera:{
|
|
|
|
|
type:'gs',
|
|
|
|
|
radius:25000,
|
|
|
|
|
heading:25,
|
|
|
|
|
pitch:-35
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
camera: {
|
|
|
|
|
type: "gs",
|
|
|
|
|
radius: 25000,
|
|
|
|
|
heading: 25,
|
|
|
|
|
pitch: -35,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
mapLayer.markerLayer.addGraphic(uav);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const boostrapUav = () => {
|
|
|
|
|
initModel();
|
|
|
|
|
onAddKeyboardListener();
|
|
|
|
|
const renderer = () => {
|
|
|
|
|
startgamepad()
|
|
|
|
|
onAdjustParams();
|
|
|
|
|
onAdjustAttitude();
|
|
|
|
|
requestAnimationFrame(renderer);
|
|
|
|
|
};
|
|
|
|
|
renderer();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const startgamepad = () => {
|
|
|
|
|
var gamepad = navigator.getGamepads()[0]
|
|
|
|
|
if (gamepad) {
|
|
|
|
|
//手柄方向按键
|
|
|
|
|
// pressKey(gamepad!.buttons)
|
|
|
|
|
// 手柄方向遥感
|
|
|
|
|
rocker(gamepad.axes)
|
|
|
|
|
//开启按键监听
|
|
|
|
|
const onAddKeyboardListener = () => {
|
|
|
|
|
document.addEventListener("keydown", (e) => {
|
|
|
|
|
if (Object.keys(keyboardMap).includes(e.key)) {
|
|
|
|
|
keyboardMap[e.key] = true;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
document.addEventListener("keyup", (e) => {
|
|
|
|
|
if (Object.keys(keyboardMap).includes(e.key)) {
|
|
|
|
|
keyboardMap[e.key] = false;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
//开启飞行参数调整
|
|
|
|
|
const onAdjustParams = () => {
|
|
|
|
|
if (keyboardMap[DIRECTION.SPEED_UP]) {
|
|
|
|
|
params.speed += 100;
|
|
|
|
|
}
|
|
|
|
|
const rocker = (axes) => {
|
|
|
|
|
const deadZone = 0.5
|
|
|
|
|
const x = axes[0]
|
|
|
|
|
const y = axes[1]
|
|
|
|
|
|
|
|
|
|
// //机体左转
|
|
|
|
|
if (x < -deadZone) {
|
|
|
|
|
//机体左转
|
|
|
|
|
params.heading -= 0.1
|
|
|
|
|
if (params.roll > -0.785) {
|
|
|
|
|
params.roll -= 1
|
|
|
|
|
}
|
|
|
|
|
} else if (x > deadZone) {
|
|
|
|
|
//机体右转
|
|
|
|
|
params.heading += 0.1
|
|
|
|
|
if (params.roll < 0.785) {
|
|
|
|
|
params.roll += 0.1
|
|
|
|
|
}
|
|
|
|
|
if (keyboardMap[DIRECTION.SPEED_DOWN]) {
|
|
|
|
|
if (params.speed >= 500) {
|
|
|
|
|
params.speed -= 100;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检测垂直方向机体爬升
|
|
|
|
|
if (y < -deadZone && params.pitch <= 0.3) {
|
|
|
|
|
params.pitch += 0.015
|
|
|
|
|
if (params.pitch > 0) {
|
|
|
|
|
const { speed, pitch } = params
|
|
|
|
|
const temp = (params.speed / 60 / 60 / 60) * 110
|
|
|
|
|
//1经纬度约等于110km
|
|
|
|
|
params.altitude += temp * Math.sin(pitch)
|
|
|
|
|
}
|
|
|
|
|
} else if (y > deadZone && params.pitch >= -0.3) {
|
|
|
|
|
//机体俯冲
|
|
|
|
|
params.pitch -= 0.016
|
|
|
|
|
if (params.pitch < 0) {
|
|
|
|
|
const { speed, pitch } = params
|
|
|
|
|
//1经纬度约等于110km
|
|
|
|
|
const temp = (params.speed / 60 / 60 / 60) * 110
|
|
|
|
|
params.altitude += temp * Math.sin(pitch)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//机体爬升
|
|
|
|
|
if (keyboardMap[DIRECTION.UP] && params.pitch <= 0.3) {
|
|
|
|
|
params.pitch += 0.005;
|
|
|
|
|
if (params.pitch > 0) {
|
|
|
|
|
const { speed, pitch } = params;
|
|
|
|
|
const temp = (params.speed / 60 / 60 / 60) * 110;
|
|
|
|
|
//1经纬度约等于110km
|
|
|
|
|
params.altitude += temp * Math.sin(pitch);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uavCommit()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const uavCommit = () => {
|
|
|
|
|
const { heading, pitch, roll } = params
|
|
|
|
|
const { abs, cos } = Math
|
|
|
|
|
params.correction = abs(cos(heading) * cos(pitch))
|
|
|
|
|
if (abs(heading) < 0.001) params.heading = 0
|
|
|
|
|
if (abs(roll) < 0.001) params.roll = 0
|
|
|
|
|
if (abs(pitch) < 0.001) params.pitch = 0
|
|
|
|
|
//方向自动回正
|
|
|
|
|
// if (params.heading > 0) params.heading -= 0.0025
|
|
|
|
|
// if (params.heading < 0) params.heading += 0.0025
|
|
|
|
|
if (params.roll > 0) params.roll -= 0.003
|
|
|
|
|
if (params.roll < 0) params.roll += 0.003
|
|
|
|
|
if (params.pitch < 0) params.pitch += 0.005
|
|
|
|
|
if (params.pitch > 0) params.pitch -= 0.003
|
|
|
|
|
//机体俯冲
|
|
|
|
|
if (keyboardMap[DIRECTION.DOWN] && params.pitch >= -0.3) {
|
|
|
|
|
params.pitch -= 0.006;
|
|
|
|
|
if (params.pitch < 0) {
|
|
|
|
|
const { speed, pitch } = params;
|
|
|
|
|
//1经纬度约等于110km
|
|
|
|
|
const temp = (params.speed / 60 / 60 / 60) * 110;
|
|
|
|
|
params.altitude += temp * Math.sin(pitch);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 开启飞行姿态调整
|
|
|
|
|
const onAdjustAttitude = () => {
|
|
|
|
|
const temp = params.speed / 60 / 60 / 60 / 110
|
|
|
|
|
params.lng += temp * Math.cos(params.heading)
|
|
|
|
|
params.lat -= temp * Math.sin(params.heading)
|
|
|
|
|
const { lng, lat, altitude, heading, pitch, roll } = params
|
|
|
|
|
params.altitude += temp * Math.sin(pitch) * 110 * 1000 * 10
|
|
|
|
|
|
|
|
|
|
// const position = Cesium.Cartesian3.fromDegrees(lng, lat, altitude)
|
|
|
|
|
// const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll)
|
|
|
|
|
// const orientation = Cesium.Transforms.headingPitchRollQuaternion(
|
|
|
|
|
// position,
|
|
|
|
|
// hpr
|
|
|
|
|
// )
|
|
|
|
|
|
|
|
|
|
const point = new mars3d.LngLatPoint(lng, lat, altitude)
|
|
|
|
|
|
|
|
|
|
uav.model.setStyle({
|
|
|
|
|
heading:heading,
|
|
|
|
|
pitch:pitch,
|
|
|
|
|
roll:roll,
|
|
|
|
|
})
|
|
|
|
|
uav.addTimePosition(point)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//机体左转
|
|
|
|
|
if (keyboardMap[DIRECTION.LEFT]) {
|
|
|
|
|
params.heading -= 0.115;
|
|
|
|
|
if (params.roll > -10) {
|
|
|
|
|
params.roll -= 0.115;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//机体右转
|
|
|
|
|
if (keyboardMap[DIRECTION.RIGHT]) {
|
|
|
|
|
params.heading += 0.115;
|
|
|
|
|
if (params.roll < 10) {
|
|
|
|
|
params.roll += 0.115;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
const { heading, pitch, roll } = params;
|
|
|
|
|
const { abs, cos } = Math;
|
|
|
|
|
params.correction = abs(cos(heading) * cos(pitch));
|
|
|
|
|
if (abs(heading) < 0.001) params.heading = 0;
|
|
|
|
|
if (abs(roll) < 0.001) params.roll = 0;
|
|
|
|
|
if (abs(pitch) < 0.001) params.pitch = 0;
|
|
|
|
|
//方向自动回正
|
|
|
|
|
// if (params.heading > 0) params.heading -= 0.0025
|
|
|
|
|
// if (params.heading < 0) params.heading += 0.0025
|
|
|
|
|
if (params.roll > 0) params.roll -= 0.003;
|
|
|
|
|
if (params.roll < 0) params.roll += 0.003;
|
|
|
|
|
if (params.pitch < 0) params.pitch += 0.005;
|
|
|
|
|
if (params.pitch > 0) params.pitch -= 0.003;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 开启飞行姿态调整/
|
|
|
|
|
const onAdjustAttitude = () => {
|
|
|
|
|
const temp = params.speed / 60 / 60 / 60 / 110;
|
|
|
|
|
params.lng += temp * Math.cos(params.heading);
|
|
|
|
|
params.lat -= temp * Math.sin(params.heading);
|
|
|
|
|
const { lng, lat, altitude, heading, pitch, roll } = params;
|
|
|
|
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
|
|
window.removeEventListener("gamepadconnected", );
|
|
|
|
|
window.removeEventListener("gamepaddisconnected", );
|
|
|
|
|
});
|
|
|
|
|
params.altitude += temp * Math.sin(pitch) * 110 * 1000 * 10;
|
|
|
|
|
|
|
|
|
|
const position = Cesium.Cartesian3.fromDegrees(lng, lat, altitude);
|
|
|
|
|
const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
|
|
|
|
|
const orientation = Cesium.Transforms.headingPitchRollQuaternion(
|
|
|
|
|
position,
|
|
|
|
|
hpr
|
|
|
|
|
);
|
|
|
|
|
uav.model.setStyle({
|
|
|
|
|
heading,
|
|
|
|
|
pitch,
|
|
|
|
|
roll
|
|
|
|
|
});
|
|
|
|
|
// uav.model.orientation= orientation //【问题:这一步需要修改通过键盘左右键的时候无人机需要做相关动作,而现在这个参数只只读,现在只能更改坐标,飞机无动作】
|
|
|
|
|
uav.addTimePosition(position);
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|