navara_wasm_api
navara_wasm_api は、地理空間計算、座標変換、交差判定などのユーティリティ機能を提供する API です。この API は、3D 地理空間アプリケーションで必要な数学的計算を簡単に実行できるように設計されています。
Ellipsoid Functions
Section titled “Ellipsoid Functions”WGS84 楕円体の基本パラメータを取得する関数群です。
getWGS84SemiMajorAxis()
Section titled “getWGS84SemiMajorAxis()”WGS84 楕円体の長半径を取得します。
getWGS84SemiMajorAxis(): numberReturns:
WGS84 楕円体の長半径(メートル)
Example:
const semiMajorAxis = getWGS84SemiMajorAxis();console.log(`長半径: ${semiMajorAxis} m`); // 長半径: 6378137 mgetWGS84SemiMinorAxis()
Section titled “getWGS84SemiMinorAxis()”WGS84 楕円体の短半径を取得します。
getWGS84SemiMinorAxis(): numberReturns:
WGS84 楕円体の短半径(メートル)
Example:
const semiMinorAxis = getWGS84SemiMinorAxis();console.log(`短半径: ${semiMinorAxis} m`); // 短半径: 6356752.314245 mgetWGS84EccentricitySquared()
Section titled “getWGS84EccentricitySquared()”WGS84 楕円体の離心率の二乗を取得します。
getWGS84EccentricitySquared(): numberReturns:
WGS84 楕円体の離心率の二乗
getWGS84Flattening()
Section titled “getWGS84Flattening()”WGS84 楕円体の扁平率を取得します。
getWGS84Flattening(): numberReturns:
WGS84 楕円体の扁平率
getWGS84Eccentricity()
Section titled “getWGS84Eccentricity()”WGS84 楕円体の離心率を取得します。
getWGS84Eccentricity(): numberReturns:
WGS84 楕円体の離心率
Coordinate Transformation
Section titled “Coordinate Transformation”座標系間の変換を行う関数群です。
geodeticToXyz(lle: LLE)
Section titled “geodeticToXyz(lle: LLE)”測地座標(緯度経度高度)を ECEF 座標系(地心直交座標系)に変換します。
geodeticToXyz(lle: LLE): Vec3Parameters:
lle: 変換する測地座標lat: 緯度(ラジアン)lng: 経度(ラジアン)height: 高度(メートル)
Returns:
ECEF 座標系での位置 [x, y, z]
Example:
const lle = { lat: 0.6283, lng: 2.4435, height: 100 }; // 東京付近const ecef = geodeticToXyz(lle);console.log(`ECEF座標: [${ecef.x}, ${ecef.y}, ${ecef.z}]`);xyzToGeodetic(vec3: Vec3)
Section titled “xyzToGeodetic(vec3: Vec3)”ECEF 座標系を測地座標(緯度経度高度)に変換します。
xyzToGeodetic(vec3: Vec3): LLEParameters:
vec3: 変換する ECEF 座標 [x, y, z]
Returns:
測地座標:
lat: 緯度(ラジアン)lng: 経度(ラジアン)height: 高度(メートル)
Example:
const ecef = { x: -3946416, y: 3364068, z: 3702654 }; // 東京付近のECEF座標const lle = xyzToGeodetic(ecef);console.log(`緯度: ${lle.lat}, 経度: ${lle.lng}, 高度: ${lle.height}`);angleToRadian(degree: number)
Section titled “angleToRadian(degree: number)”角度を度からラジアンに変換します。
angleToRadian(degree: number): numberParameters:
degree: 度単位の角度
Returns:
ラジアン単位の角度
Example:
const radians = angleToRadian(90);console.log(`90度 = ${radians} ラジアン`); // 90度 = 1.5708 ラジアンangleToDegree(radian: number)
Section titled “angleToDegree(radian: number)”角度をラジアンから度に変換します。
angleToDegree(radian: number): numberParameters:
radian: ラジアン単位の角度
Returns:
度単位の角度
Example:
const degrees = angleToDegree(Math.PI);console.log(`π ラジアン = ${degrees} 度`); // π ラジアン = 180 度Screen-World Projection
Section titled “Screen-World Projection”スクリーン座標と世界座標間の変換を行う関数群です。
screenToWorld(window, transform, frustum, screen_pos)
Section titled “screenToWorld(window, transform, frustum, screen_pos)”スクリーン座標を世界座標に変換します。
screenToWorld( window: Window, transform: Transform, frustum: CameraFrustum, screen_pos: Vec2): Vec3 | nullParameters:
window: ウィンドウ情報transform: カメラの変換行列frustum: カメラの視錐台screen_pos: スクリーン座標 [x, y]
Returns:
世界座標での位置、または交差しない場合は null
Example:
const worldPos = screenToWorld(window, cameraTransform, frustum, { x: 400, y: 300,});if (worldPos) { console.log(`世界座標: [${worldPos.x}, ${worldPos.y}, ${worldPos.z}]`);}worldToScreen(window, transform, frustum, world_pos)
Section titled “worldToScreen(window, transform, frustum, world_pos)”世界座標をスクリーン座標に変換します。
worldToScreen( window: Window, transform: Transform, frustum: CameraFrustum, world_pos: Vec3): Vec2 | nullParameters:
window: ウィンドウ情報transform: カメラの変換行列frustum: カメラの視錐台world_pos: 世界座標での位置
Returns:
スクリーン座標、または視野外の場合は null
Example:
const screenPos = worldToScreen( window, cameraTransform, frustum, worldPosition);if (screenPos) { console.log(`スクリーン座標: [${screenPos.x}, ${screenPos.y}]`);}Intersection and Ray Casting
Section titled “Intersection and Ray Casting”交差判定とレイキャスティングを行う関数群です。
getPlaneFromPointNormal(point, normal)
Section titled “getPlaneFromPointNormal(point, normal)”点と法線ベクトルから平面を作成します。
getPlaneFromPointNormal(point: Vec3, normal: Vec3): PlaneParameters:
point: 平面上の点normal: 平面の法線ベクトル
Returns:
作成された平面
Example:
const point = { x: 0, y: 0, z: 0 };const normal = { x: 0, y: 0, z: 1 }; // Z軸方向const plane = getPlaneFromPointNormal(point, normal);getPickRay(window, transform, frustum, screen_pos)
Section titled “getPickRay(window, transform, frustum, screen_pos)”スクリーン座標からピッキング用のレイを生成します。
getPickRay( window: Window, transform: Transform, frustum: CameraFrustum, screen_pos: Vec2): RayParameters:
window: ウィンドウ情報transform: カメラの変換行列frustum: カメラの視錐台screen_pos: スクリーン座標
Returns:
生成されたレイ
Example:
const ray = getPickRay(window, cameraTransform, frustum, { x: 400, y: 300 });console.log(`レイの原点: [${ray.origin.x}, ${ray.origin.y}, ${ray.origin.z}]`);getRayPlaneIntersection(ray, plane)
Section titled “getRayPlaneIntersection(ray, plane)”レイと平面の交点を計算します。
getRayPlaneIntersection(ray: Ray, plane: Plane): Vec3 | nullParameters:
ray: 交差判定を行うレイplane: 交差判定を行う平面
Returns:
交点の座標、または交差しない場合は null
Example:
const intersection = getRayPlaneIntersection(ray, plane);if (intersection) { console.log( `交点: [${intersection.x}, ${intersection.y}, ${intersection.z}]` );}getHeightFromEllipsoid(point)
Section titled “getHeightFromEllipsoid(point)”指定した点の楕円体からの高度を取得します。
getHeightFromEllipsoid(point: Vec3): numberParameters:
point: 高度を計算する点の ECEF 座標
Returns:
楕円体からの高度(メートル)
Example:
const height = getHeightFromEllipsoid({ x: -3946416, y: 3364068, z: 3702654 });console.log(`高度: ${height} m`);Surface Normal and Reference Frames
Section titled “Surface Normal and Reference Frames”地表面の法線ベクトルと参照フレームを計算する関数群です。
geodeticSurfaceNormal(lle)
Section titled “geodeticSurfaceNormal(lle)”測地座標での地表面法線ベクトルを計算します。
geodeticSurfaceNormal(lle: LLE): Vec3Parameters:
lle: 測地座標
Returns:
正規化された地表面法線ベクトル
Example:
const lle = { lat: 0.6283, lng: 2.4435, height: 0 };const normal = geodeticSurfaceNormal(lle);console.log(`法線ベクトル: [${normal.x}, ${normal.y}, ${normal.z}]`);eastNorthUpToFixedFrame(origin)
Section titled “eastNorthUpToFixedFrame(origin)”East-North-Up 座標系から固定フレームへの変換行列を取得します。
eastNorthUpToFixedFrame(origin: Vec3): number[]Parameters:
origin: 原点の ECEF 座標
Returns:
4x4 変換行列(列優先順序で 16 要素の配列)
Example:
const origin = { x: -3946416, y: 3364068, z: 3702654 };const matrix = eastNorthUpToFixedFrame(origin);// 4x4行列として使用northEastDownToFixedFrame(origin)
Section titled “northEastDownToFixedFrame(origin)”North-East-Down 座標系から固定フレームへの変換行列を取得します。
northEastDownToFixedFrame(origin: Vec3): number[]Parameters:
origin: 原点の ECEF 座標
Returns:
4x4 変換行列(列優先順序で 16 要素の配列)
northUpEastToFixedFrame(origin)
Section titled “northUpEastToFixedFrame(origin)”North-Up-East 座標系から固定フレームへの変換行列を取得します。
northUpEastToFixedFrame(origin: Vec3): number[]Parameters:
origin: 原点の ECEF 座標
Returns:
4x4 変換行列(列優先順序で 16 要素の配列)
northWestUpToFixedFrame(origin)
Section titled “northWestUpToFixedFrame(origin)”North-West-Up 座標系から固定フレームへの変換行列を取得します。
northWestUpToFixedFrame(origin: Vec3): number[]Parameters:
origin: 原点の ECEF 座標
Returns:
4x4 変換行列(列優先順序で 16 要素の配列)
Usage Examples
Section titled “Usage Examples”基本的な座標変換
Section titled “基本的な座標変換”// 度をラジアンに変換const latRad = angleToRadian(35.6762); // 東京の緯度const lngRad = angleToRadian(139.6503); // 東京の経度
// 測地座標をECEF座標に変換const lle = { lat: latRad, lng: lngRad, height: 100 };const ecef = geodeticToXyz(lle);
// ECEF座標を測地座標に戻すconst convertedLle = xyzToGeodetic(ecef);スクリーンピッキング
Section titled “スクリーンピッキング”// マウス位置からレイを生成const mousePos = { x: event.clientX, y: event.clientY };const ray = getPickRay(window, cameraTransform, frustum, mousePos);
// 地面との交点を計算const groundPlane = getPlaneFromPointNormal( { x: 0, y: 0, z: 0 }, { x: 0, y: 0, z: 1 });const intersection = getRayPlaneIntersection(ray, groundPlane);
if (intersection) { console.log("地面をクリックした位置:", intersection);}座標系変換行列の使用
Section titled “座標系変換行列の使用”// 東京の位置でEast-North-Up座標系を設定const tokyoEcef = geodeticToXyz({ lat: angleToRadian(35.6762), lng: angleToRadian(139.6503), height: 0,});
const enuMatrix = eastNorthUpToFixedFrame(tokyoEcef);// この行列を使用してローカル座標系でオブジェクトを配置