【问题标题】:Texture on sphere not aligned correctly? Lat/Lon -> Cartesian xyz球体上的纹理未正确对齐?纬度/经度 -> 笛卡尔 xyz
【发布时间】:2018-01-15 03:56:14
【问题描述】:

我想知道我的球体的纹理是否以某种方式未正确应用,是否可以以某种方式抵消它?我试图通过提供纬度/经度并转换为笛卡尔 xyz 坐标在澳大利亚悉尼放置一个盒子。但是,盒子没有放在正确的位置。我的猜测是,由于原始图像是墨卡托地图,因此当将其应用于球体时,纬度/经度中心点不正确。

下面的代码是一个最小的可重现示例。

  1. 我正在加载地球图像并将其应用到球体(半径 = 400)。
  2. 然后我提供澳大利亚悉尼的纬度/经度 (33.8688, -151.2093) 并转换为弧度。
  3. 将纬度/经度转换为笛卡尔 xyz(取自:https://stackoverflow.com/a/1185413/3723165
  4. 将一个盒子平移并推送到该位置。

这是放置那个盒子的地方:

可重现的代码

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>

【问题讨论】:

  • 好的,我部分地想出了问题所在。如果我绘制纬度 0,经度 0 它显示在印度和泰国之间,这是不正确的。纬度 0,经度 0 应仅绘制非洲西海岸。我该如何纠正?我认为将纹理应用于球体时出现 p5.js 错误。因为如果我在处理中使用完全相同的代码,它会在非洲海岸正确绘制。

标签: javascript processing p5.js


【解决方案1】:

这里有很多问题:

1) 您的悉尼坐标不正确,纬度为负(-33.8688, 151.2093)。

2) 垂直(极轴)轴对应于 Y 坐标,而不是 Z 坐标(我知道这很令人困惑)。所以我交换了 Y 和 Z 的计算。

3) 需要一些偏移才能获得准确的放置。由于您没有提供纹理映射,所有纹理放置都是在幕后完成的,并且在球体上,从哪里开始纹理是非常模糊的。经过反复试验,我确定它与经度相差 180 度。

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();
}

这是一个工作示例: https://www.openprocessing.org/sketch/443758

【讨论】:

  • 完美。谢谢!我知道我错过了消极的一面。当它不是负数时,我的原始代码正在靠近悉尼。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多