Изометрическая проекция в 2d системе координат

Какое уравнение необходимо для перемещения точки на изометрической плоскости в двумерном пространстве?

Я посмотрел несколько мест на трубах. В основном здесь, и я не смог его расшифровать . Я не математик, к сожалению.

Что мне нужно сделать, так это переместить точку из (0,0) в (1,0) или (0,1) на изометрической плоскости, состоящей из блоков по 10 пикселей. В обычном городке я бы просто сделал (x+10, y+0) или (x+0, y+10), чтобы переместиться на мою 2D-плоскость.

Я делаю большую часть своей работы в Core Animation на iPhone, если это дает лучший контекст.

Спасибо за ваше время.

DP


person SageAMDP    schedule 27.07.2009    source источник


Ответы (3)


Что ж, если вы планируете больше заниматься графическим программированием игр, я бы посоветовал хотя бы стремиться к несовершеннолетнему по математике.

На самом деле, если вы продолжите заниматься графикой, как это, было бы неплохо получить знания в области тригонометрии, матричной алгебры и векторной алгебры. Использование векторов и матриц упрощает более сложные преобразования (например, перспективную проекцию), а также может помочь с более простыми преобразованиями, такими как изометрические.

В любом случае (и часть этого, если не многое из этого, может быть рассмотрено для вас): по сути, то, что делает так называемое «графическое преобразование», является буквальным преобразованием точек через некоторую комбинацию переводов, вращений, масштабов, отражения и сдвиги; большинство этих понятий должно быть вам знакомо по двумерной системе координат и может быть выражено довольно просто. В следующих примерах я буду использовать отрезок, определяемый двумя точками, выраженными в форме «(x1, y1), (x2, y2)»; вы можете нарисовать их на листе миллиметровой бумаги или на чем-то еще для более легкого понимания.

Примеры: перевод будет происходить от (0, 0), (1, 0) к (1, 0), (2, 0) или от (0, 0), (1, 0) к (0, 1). ), (1, 1); вращение будет происходить от (0, 0), (1, 0) до (0, 0), (0, 1); масштабирование будет происходить от (0, 0), (1, 0) до (0, 0), (2, 0) или от (0, 0), (1, 0) до (0, 0), (0,5). , 0).

Используя более упрощенную запись, перевод одной точки (x, y) можно выразить как (x + a, y + b), где a и b — константы в диапазоне всех действительных чисел. Вращение будет (x*cos(theta), y * sin(theta)), где "theta" – это угловое значение, на которое вы хотите повернуть, а масштаб будет (ax, by), где a — коэффициент масштабирования по оси x, а b — коэффициент масштабирования по оси y. (Единая шкала – это шкала с одинаковыми масштабными коэффициентами для обеих осей, поэтому она будет равна (ax, ay).)

Комбинация простых преобразований позволяет вам перемещать объекты практически так, как вы хотите, и самый простой способ объединения простых преобразований — это использование умножение матриц.

…Вообще-то, такие вещи вам, возможно, лучше изучить с помощью самообучения или какого-нибудь математического занятия, так как теперь я понимаю, что мне самому потребовалось бы слишком много времени, чтобы даже начать вас на самом деле. понимание этих вещей, но я дам вам другие ссылки, которые я могу найти на данный момент.

http://en.wikipedia.org/wiki/Transformation_(геометрия)< br> http://en.wikipedia.org/wiki/Transformation_matrix
http://en.wikipedia.org/wiki/Euclidean_vector (может быть вам необходимо, а может и не быть.)

В любом случае... хотя вы можете просто использовать уравнения преобразования, которые найдете где-нибудь в Интернете, гораздо лучше узнать, как на самом деле работают преобразования, и научиться применять их самостоятельно, так как это позволит вам быть более гибким и иметь возможность выполнять преобразования различными способами, если это необходимо, а также позволять вам выполнять более сложные преобразования самостоятельно.

Я надеюсь, что это помогло вам; это может быть не тот ответ, который вам, вероятно, нужен, но если вы готовы потратить время и усилия на самообучение (или на то, чтобы вас учили, если вы решите пойти куда-нибудь на курсы [в конце концов, самообучение — это не для всех]) как работать с матрицами и преобразованиями матриц и тому подобное, вы, вероятно, поймете, что вы пытаетесь сделать немного больше.

РЕДАКТИРОВАТЬ: Конечно, если у вас уже определены графические преобразования и вам не нужно беспокоиться о них самостоятельно, то очень легко перемещать точку на любой плоскости, параллельной любой оси в трехмерном пространстве. По сути, в памяти точки лежат (или должны лежать) в «нормальной вилле», если использовать ваше слово, в трехмерной декартовой системе координат. Предполагая, что плоскость, вдоль которой происходит движение, является плоскостью z = 0, а координаты точки хранятся в формате, эквивалентном (x, y, z), вы можете перемещать точку, просто используя, скажем, (x + 10, у, 0) или (х, у + 10, 0); если у вас есть точка, которая находится на более высокой плоскости, чем другие, вы просто устанавливаете более высокое значение для z (а если у вас есть точка на более низкой плоскости, вы устанавливаете значение для z ‹ 0). После того, как вы применили движение к самой точке, вы можете применить графическое преобразование к среде, если вы еще этого не сделали, что настраивает ее для правильного отображения на вашем устройстве вывода (в вашем случае iPhone). Применение преобразования немного сложнее, но если у вас есть заранее написанный метод для этого, то все готово.

person JAB    schedule 27.07.2009

Если вы работаете с базовой анимацией, вы можете легко сделать это с помощью правильного применения трехмерного преобразования. Создание CATransform3D с использованием следующего кода:

CATransform3D perspectiveRotation = CATransform3DMakeRotation(-40.0 * M_PI / 180.0, 0.0, 1.0, 0.0);
perspectiveRotation = CATransform3DRotate(perspectiveRotation, -55.0 * M_PI / 180.0, perspectiveRotation.m11, perspectiveRotation.m21, perspectiveRotation.m31);

а затем применение этого преобразования с использованием соответствующего свойства вашего CALayer (или слоя поддержки UIView) наклонит слой в 3D. Движение подслоев на этом слое по-прежнему будет происходить в обычном декартовом координатном пространстве, но у вас будет изометрическая перспектива для этих подслоев.

В качестве предостережения вам может потребоваться вручную настроить компонент преобразования m34, чтобы предотвратить появление эффектов перспективы.

person Brad Larson    schedule 28.07.2009

Вы должны разработать свое изометрическое преобразование; то есть у вас должно быть преобразование, которое говорит вам из исходных координат, где что-то находится на изометрической проекции. Например, изометрическая проекция может быть чем-то вроде ((isox = x + (y/2)), (isoy = y)) (просто дерьмовый пример). Из этого уравнения вы можете взять свои координаты x и y "нормального городка" и вычислить из них свою проекцию.

person Paul Sonier    schedule 27.07.2009