2024-08-13 14:39:49 +00:00
|
|
|
|
import hipparcos_catalog from "./hipparcos_7_concise.js";
|
2024-08-13 10:56:27 +00:00
|
|
|
|
import CatalogSkybox from "./CatalogSkybox.js";
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 20240814 blitheli
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 由hipparcos星表数据生成天空盒子的一个面的图片
|
|
|
|
|
*
|
|
|
|
|
* 通过Canvas绘制,纯黑色背景,行星为白色,大小和亮度与星等相关
|
|
|
|
|
*
|
|
|
|
|
* 用户可以通过这个函数生成天空盒子的6个面的图片,然后通过Cesium的SkyBox类创建自定义的天空盒
|
|
|
|
|
*
|
|
|
|
|
* 目前数据为hipparcos星表数据(仅考虑星等7以上亮度):./hipparcos_7_concise.js
|
|
|
|
|
* 来源: https://github.com/gmiller123456/hip2000
|
|
|
|
|
* 可根据需要自行下载和替换数据
|
|
|
|
|
*
|
|
|
|
|
* @param {number} faceId0 立方体盒子的面id,0: mx, 1: my, 2: px, 3: py, 4: pz, 5: mz
|
|
|
|
|
* @param {number} width 图片的宽度(高度也是这个值),单位:像素
|
|
|
|
|
* @returns base64格式的图片(png)
|
|
|
|
|
*/
|
2024-08-13 14:39:49 +00:00
|
|
|
|
function createSkyboxImage(faceId0, width) {
|
|
|
|
|
// 恒星亮度(等级),亮度等级越小,亮度越大
|
|
|
|
|
const magBright = -1;
|
|
|
|
|
const magMedium = 7;
|
|
|
|
|
const magDim = 12;
|
|
|
|
|
// 恒星大小,单位像素
|
|
|
|
|
const sizeBright = 5;
|
|
|
|
|
const sizeMedium = 1;
|
|
|
|
|
const sizeDim = 0.1;
|
|
|
|
|
// 恒星透明度(1为不透明,0为透明)
|
|
|
|
|
const translucentBright = 1.0;
|
2024-08-14 08:48:59 +00:00
|
|
|
|
const translucentMedium = 0.75;
|
2024-08-13 14:39:49 +00:00
|
|
|
|
const translucentDim = 0.2;
|
|
|
|
|
|
|
|
|
|
const d2r = Math.PI / 180;
|
|
|
|
|
|
|
|
|
|
// 创建width*width的jpg格式的图片,背景为黑色,随机生成1000个像素点,颜色为白色,大小从1到5像素不等
|
|
|
|
|
var canvas = document.createElement("canvas");
|
|
|
|
|
canvas.width = width;
|
|
|
|
|
canvas.height = width;
|
|
|
|
|
var context = canvas.getContext("2d");
|
|
|
|
|
// 黑色背景
|
|
|
|
|
context.fillStyle = "black";
|
|
|
|
|
context.fillRect(0, 0, width, width);
|
|
|
|
|
|
|
|
|
|
// 循环hipparcos数据,hipparcos_catalog为数组
|
|
|
|
|
for (var id = 0; id < hipparcos_catalog.length; id++) {
|
|
|
|
|
var star = hipparcos_catalog[id];
|
|
|
|
|
var mag = star[1];
|
|
|
|
|
var ra = star[2];
|
|
|
|
|
var dec = star[3];
|
|
|
|
|
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 赤经原始为0-360°,需要转换为[-180,180]°
|
2024-08-13 14:39:49 +00:00
|
|
|
|
if (ra > 180) {
|
|
|
|
|
ra = ra - 360;
|
2024-08-13 10:56:27 +00:00
|
|
|
|
}
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 赤经赤纬转换为弧度
|
2024-08-13 14:39:49 +00:00
|
|
|
|
ra = ra * d2r;
|
|
|
|
|
dec = dec * d2r;
|
2024-08-13 10:56:27 +00:00
|
|
|
|
|
2024-08-13 14:39:49 +00:00
|
|
|
|
// 赤经、赤纬转换为立方盒子坐标,再转换为图片坐标
|
|
|
|
|
let { x, y, z } = CatalogSkybox.sphere2CubeXyz(ra, dec);
|
2024-08-13 10:56:27 +00:00
|
|
|
|
|
2024-08-13 14:39:49 +00:00
|
|
|
|
// 转换为图片坐标(i,为横坐标,向右,[0,1]), (j为纵坐标,向下,[0,1])
|
|
|
|
|
let { i, j, faceId } = CatalogSkybox.cubeXyzToImgUV(x, y, z);
|
2024-08-13 10:56:27 +00:00
|
|
|
|
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 不是当前盒子面的点,不绘制,直接跳过
|
2024-08-13 14:39:49 +00:00
|
|
|
|
if (faceId !== faceId0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 像素大小、透明度(根据星等,按照最大值和最小值线性插值)
|
|
|
|
|
let size = sizeBright; // 默认最大值
|
2024-08-13 14:39:49 +00:00
|
|
|
|
let translucent = translucentBright;
|
|
|
|
|
if (mag > magBright && mag <= magMedium) {
|
|
|
|
|
size =
|
|
|
|
|
sizeMedium +
|
|
|
|
|
((sizeBright - sizeMedium) * (mag - magMedium)) /
|
|
|
|
|
(magBright - magMedium);
|
|
|
|
|
translucent =
|
|
|
|
|
translucentMedium +
|
|
|
|
|
((translucentBright - translucentMedium) * (mag - magMedium)) /
|
|
|
|
|
(magBright - magMedium);
|
|
|
|
|
}
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 亮度太暗,设最小值
|
2024-08-13 14:39:49 +00:00
|
|
|
|
else if (mag > magMedium) {
|
|
|
|
|
size = sizeDim;
|
|
|
|
|
translucent = translucentDim;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 图像坐标系下的坐标(考虑到图片的大小,精确到实际的像素坐标)
|
2024-08-13 14:39:49 +00:00
|
|
|
|
let u = i * width - size / 2;
|
|
|
|
|
let v = j * width - size / 2;
|
|
|
|
|
if (u < 0) {
|
|
|
|
|
u = 0;
|
|
|
|
|
}
|
|
|
|
|
if (v < 0) {
|
|
|
|
|
v = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 画点,白色,带透明度
|
|
|
|
|
context.fillStyle = `rgba(255,255,255,${translucent})`;
|
|
|
|
|
context.fillRect(u, v, size, size);
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-14 08:48:59 +00:00
|
|
|
|
// 生成base64格式的图片
|
2024-08-13 14:39:49 +00:00
|
|
|
|
var dataUrl = canvas.toDataURL("image/jpeg");
|
|
|
|
|
return dataUrl;
|
2024-08-13 10:56:27 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-13 14:39:49 +00:00
|
|
|
|
export default createSkyboxImage;
|