그것은 당신이 이미 어려운 부분을했을 것 같습니다 ORG.
360 ° 이미지의 중심이 북쪽에서 130 ° (나침반 주위로 시계 방향으로 가정)이고 카메라 위치에서의 방위와 핫스팟이 북쪽에서 170 ° 인 경우 핫스팟이 이미지의 중심을 기준으로 이미지에서 40 °. 그리고 이미지가 수평으로 360 °와 1024px를 포함하고 있기 때문에 핫스팟은 이미지 중앙에서 1024px/360 * 40o = 114px 위치에있는 것처럼 보입니다.
카메라와 핫 스폿이 모두 같은 고도에 있기 때문에 상대 피치는 0입니다. 512 + 114 256 + 0 = 좌표 :
함께 이러는하면 좌표 얻을 626, 핫스팟의 고도가 카메라와 같은 아니라면 256
를 그럼 거라고 몇 가지 간단한 방법을 사용하여 피치를 계산할 수 있습니다. :
먼저 ground distance
= 카메라 위치와 핫스팟 위치 사이의 지상 거리를 가정합니다. 이것은 각각의 고도에 관계없이 동일합니다.
따라서 피치는 atan [(핫스팟 고도 - 카메라 고도)/지상 거리]입니다. 예를 들어
, 당신은 100m의 지상 거리를했고 핫스팟은 당신이 당신의 피치를 계산하는 것, 아직도 2m 높이에서 카메라와 10.75m에서와 같은 인 경우 :
피치 = ATAN [(10.75m - 2m)/100m] = atan (8.75m/100m) = atan (0.0875) = 5 °
이 사진을 파노라마에 표시하려면 중간보다 512px/180o * 5o = 14px 높게 설정하십시오.가운데가 256 픽셀이고 이미지의 왼쪽 상단이 0,0이므로 256 픽셀에서 14 픽셀을 뺀 다음 242 픽셀에 도달합니다. 당신이 요청에 따라
자바 스크립트로 모두 함께이 퍼팅 :
// We'll use degrees, but this would be simpler if
// everything were computed in radians, since that
// is how the Math methods work.
function getRelativePitch(cameraAlt, hsAlt, groundDistance)
{
var degPerRad = 180/Math.PI;
if (groundDistance == 0) { return 0.0; } // fringe case
var rad = Math.atan((hsAlt - cameraAlt)/groundDistance);
// Convert to degress
return rad * degPerRad;
}
// Pretty simply this one.
function getRelativeHeading(cameraHeading, hsHeading)
{
return hsHeading - cameraHeading;
}
var cameraHeading = 130; // degrees
var hotspotHeading = 170; // degrees
var cameraAltitude = 2; // meters
var hotspotAltitude = 10.75; // meters
var groundDistance = 100; // meters
var panoWidth = 1024; // pixels
var panoHeight = 512; // pixels
var panoRangeX = 360; // degrees
var panoRangeY = 180; // degrees
var relativeHeading = getRelativeHeading(cameraHeading, hotspotHeading);
var relativePitch = getRelativePitch(cameraAltitude, hotspotAltitude, groundDistance);
// Now convert to pixels
var hotspotX = Math.round(panoWidth/2 + panoWidth/panoRangeX * relativeHeading);
var hotspotY = Math.round(panoHeight/2 - panoHeight/panoRangeY * relativePitch);
// Just in case we endup out of range
while (hotspotX < 0) { hotspotX += panoWidth; }
while (hotspotX > panoWidth) { hotspotX -= panoWidth; }
while (hotspotY < 0) { hotspotY += panoHeight; }
while (hotspotY > panoHeight) { hotspotY -= panoHeight; }
alert("Hotspot is at: " + hotspotX + ", " + hotspotY);
난이 도움이되기를 바랍니다!