Я хочу наложить прямоугольную текстуру глобуса на сферу.Я могу загрузить текстуру «globe.jpg» и отобразить ее на экране.Я думаю, что мне нужно получить цвет текстуры "globe.jpg" по определенным координатам текстуры и использовать его для раскраски определенной точки на глобусе.
Я хочу отобразить карту глобуса на правой стороне среднего наодна из сфер слева (см. рисунок)
Код для загрузки текстуры:
int texture;
public Texture() {
texture = LoadTexture("Content/globe.jpg");
}
public int LoadTexture(string file) {
Bitmap bitmap = new Bitmap(file);
int tex;
GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);
GL.GenTextures(1, out tex);
GL.BindTexture(TextureTarget.Texture2D, tex);
BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
bitmap.UnlockBits(data);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
//GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
//GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
return tex;
}
Я тоже ужеЯ думаю, что создал некоторый код, который отображает точку на сфере в точку на точке текстуры (используется код из раздела сфер отображения текстуры в https://www.cs.unc.edu/~rademach/xroads-RT/RTarticle.html).
point
, где Vector3
гделуч пересекает сферу:
vn = new Vector3(0f, 1f, 0f); //should be north pole of sphere, but it isn't based on sphere's position, so I think it's incorrect
ve = new Vector3(1f, 0f, 0f); // should be a point on the equator
float phi = (float) Math.Acos(-1 * Vector3.Dot(vn, point));
float theta = (float) (Math.Acos(Vector3.Dot(point, ve) / Math.Sin(phi))) / (2 * (float) Math.PI);
float v = phi / (float) Math.PI;
float u = Vector3.Dot(Vector3.Cross(vn, ve), point) > 0 ? theta : 1 - theta;
Я думаю, что теперь я могу использовать эту координату u и v для загруженной текстуры, чтобы найти цвет текстуры там. Но я не знаю как.также подумайте, что векторы северного полюса и экватора неверны.