2017-08-07 14 views
6

Zastanawiam się, czy tekstura do mojej sfery nie jest w jakiś sposób poprawnie zastosowana i czy mogę ją jakoś skompensować? Próbuję umieścić pudełko w Sydney w Australii, dostarczając lat/lon i konwertując do kartezjańskich współrzędnych xyz. Jednak pudełko nie jest miejscami we właściwej lokalizacji. Domyślam się, że oryginalny obraz jest mapą Mercatora, gdy jest on stosowany do sfery punkt środkowy lat/lon jest nieprawidłowy.Tekstura na kuli nie jest wyrównana poprawnie? Lat/Lon -> Kartezjański xyz

Poniższy kod jest minimalnym przykładem ponownego przetworzenia.

  1. Załaduję obraz ziemi i stosuję go do sfery (promień = 400).
  2. Dostarczam następnie szerokość/długość geograficzną dla Sydney, Australia (33.8688, -151.2093) i konwertuję na radiany.
  3. Konwersja lat/lon na xes kartezjański (pobrana z: https://stackoverflow.com/a/1185413/3723165)
  4. Tłumaczenie i pchanie pudełka do tej lokalizacji.

Oto gdzie to pole jest umieszczony: Output

Re-wytwarzanym kod

var img; 
 
var theta = 0; 
 
var r = 400; 
 
    
 
function preload() { 
 
    img = loadImage('https://eoimages.gsfc.nasa.gov/images/imagerecords/79000/79765/dnb_land_ocean_ice.2012.3600x1800.jpg'); 
 
} 
 
    
 
function setup() { 
 
    createCanvas(1600, 1200, WEBGL); 
 
} 
 

 
function draw() { 
 
    background(0); 
 

 
    rotateY(theta); 
 
    theta += 0.01; 
 

 
    texture(img); 
 
    sphere(r); 
 

 
    //Sydney, Australia Latitude/Longtidue 
 
    var lat = radians(33.8688); 
 
    var lon = radians(151.2093); 
 

 
    //cartesian coordinates 
 
    var x = r * Math.cos(lat) * Math.cos(lon); 
 
    var y = r * Math.cos(lat) * Math.sin(lon); 
 
    var z = r * Math.sin(lat); 
 

 
    push(); 
 
    translate(x, y, z); 
 
    fill(255); 
 
    box(100, 10, 10); 
 
    pop(); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.16/p5.js"></script>

+1

Ok, pomyślałem częściowo, co się stało. Jeśli wykreślę szerokość geograficzną 0, długość geograficzna 0 pokazuje między Indiami i Tajlandią, co jest nieprawidłowe. Szerokość geograficzna 0, długość geograficzna 0 powinna wykreślać tylko na zachodnim wybrzeżu Afryki. Jak mogę to poprawić? Myślę, że jest to błąd p5.js podczas stosowania tekstury do kuli. Ponieważ jeśli użyję dokładnie tego samego kodu w przetwarzaniu, to działka będzie poprawnie u wybrzeży Afryki. –

Odpowiedz

3

Istnieje szereg kwestii tutaj:

1) Twoje współrzędne dla Sydney są nieprawidłowe, szerokość geograficzna jest ujemna (-33,8688, 151,2093).

2) Oś pionowa (biegunowa) odpowiada współrzędnym Y, a nie współrzędnym Z (mylące, wiem). Wymieniłem więc obliczenia Y i Z.

3) Aby uzyskać dokładne umieszczenie, potrzebne są pewne przesunięcia. Ponieważ nie zapewniasz mapowania tekstury, wszystkie rozmieszczenie tekstur odbywa się za kulisami, a na kuli, od której zaczyna się tekstura, jest dość niejednoznaczna. Dzięki próbom i błędom ustaliłem, że ma on tylko 180 stopni na długości.

var img; 
var theta = 0; 
var r = 400; 


function preload() { 
    img = loadImage('https://eoimages.gsfc.nasa.gov/images/imagerecords/79000/79765/dnb_land_ocean_ice.2012.3600x1800.jpg'); 
} 

function setup() { 
    createCanvas(windowWidth, windowHeight, WEBGL); 
} 

function draw() { 
    background(0); 

    camera(0, 0, 200) 
    rotateY(theta); 
    theta += 0.01; 

    texture(img); 
    sphere(r); 

    //Sydney, Australia Latitude/Longtidue 
    var lat = radians(-33.8688); 
    var lon = radians(151.2093); 

    //cartesian coordinates 
    // var x = r * Math.cos(lat) * Math.cos(lon); 
    // var y = r * Math.cos(lat) * Math.sin(lon); 
    // var z = r * Math.sin(lat); 
    var x = r * Math.cos(lat) * Math.sin(lon+radians(180)); 
    var y = r * Math.sin(-lat); 
    var z = r * Math.cos(lat) * Math.cos(lon+radians(180)); 

    push(); 
    translate(x, y, z); 
    fill(255); 
    box(100, 10, 10); 
    pop(); 
} 

Oto przykład praca: https://www.openprocessing.org/sketch/443758

+0

Idealny. Dziękuję Ci! Wiem, że brakowało mi negatywu. Mój oryginalny kod spisywał się bliżej Sydney, kiedy nie był ujemny. Jeszcze raz dziękuję. –

Powiązane problemy