Мне нужно прочитать блок пикселей из буфера выбора, чтобы проверить окружающие точки на коллизии, как на картинке ниже:
Я нажимаю на свой canvas
в x
, y
- поэтому я определяю квадратную область, скажем, 11x11 пикселей с центром в cX
, cY
, а затем я считываю из буфера выбора одним выстрелом, начиная с x1
, y1
:
var w = 11, h = 11, cX = x, cY = cH - y, rc = ~~(0.5*w), x1 = cX - rc, y1 = cY + rc;
gl.readPixels(x1, y1, w, h, gl.RGBA, gl.UNSIGNED_BYTE, pickBuf);
Затем я зацикливаюсь от центра моего буфера, иду наружу, следуя красным стрелкам, проверяя положительный ответ внутри буфера выбора (обнаружено столкновение):
function readAt(i, pickBuf) {
return pickBuf[i] << 16 | pickBuf[i+1] << 8 | pickBuf[i+2];
}
var l = rc;
while(l--) {
/* Top-Left sector */
var r = rc+(rc-l), c = l, p = r*w + c, i = 4*p;
found = readAt(i, pickBuf) > 0;
/* Top-Right sector */
var r = rc+(rc-l), c = rc+(rc-l), p = r*w + c, i = 4*p;
found = readAt(i, pickBuf) > 0;
/* Bottom-Left sector */
var r = l, c = l, p = r*w + c, i = 4*p;
found = readAt(i, pickBuf) > 0;
/* Bottom-Right sector */
var r = l, c = rc+(rc-l), p = r*w + c, i = 4*p;
found = readAt(i, pickBuf) > 0;
}
Часть кода работает, и я могу выбрать геометрию, но теперь я считаю, что неправильно понял всю систему координат, потому что результат столкновения всегда выше и левее точки, где он должен быть. Почему это происходит?
Мне кажется, что readPixels
должен читать байты, начиная с левого нижнего угла canvas
, до правого верхнего угла. Это правда, или я что-то упускаю?
Я знаю, что система координат gl
инвертирована по оси Y по сравнению с моей canvas
, поэтому я определяю центр буфера для подбора в cY = cH - y
и начальную точку Y для буфера для подбора в y1 = cY + rc
, но в любом случае это дает мне неправильные результаты во время прогулки. от центра к краям моей квадратной коробки выбора. Где моя интерпретация системы координат неверна?