I need to make a grid on the floor size 8000x8000. To do this, I chose CardMaker and loaded it with a 4000x4000 pixel texture containing 40x40 cells. I also need to zoom and scale the floor grid. Unfortunately, no matter what I do, the texture does not render correctly at the bottom of the screen: the image flickers, disappears and appears at different camera heights.
my camerahandler:
class CameraHandler(DirectObject):
__slots__ = ["_cam_height", "_min_height", "_lens", "_film_size"]
def __init__(self, base: ShowBase):
super().__init__()
self._min_film_size = 5
self._base = base
self._film_size = 200
self.__setup_lens()
self.__setup_buttons()
def __setup_lens(self):
self._lens = OrthographicLens()
self._lens.setFilmSize(self._film_size, self._film_size * 0.75)
self._lens.setNearFar(-50, 50)
self._lens.setFov(180)
self._base.camera.setPos(0, 50, 0)
self._base.camNode.setLens(self._lens)
self._base.camLens.setFar(10000)
def __setup_buttons(self):
self.accept("wheel_up", self.__zoom_camera)
self.accept("wheel_down", self.__zoom_out_camera)
def __zoom_out_camera(self):
self._film_size *= 1.05
self._lens.setFilmSize(self._film_size)
def __zoom_camera(self):
if not self._base.mouseWatcherNode.hasMouse():
return
if self._film_size < 10:
return
mouse_pos = self._base.mouseWatcherNode.getMouse()
mouse_x, mouse_y = mouse_pos.getX(), mouse_pos.getY()
self._film_size *= 0.95
self._lens.setFilmSize(self._film_size)
delta_x, delta_y = mouse_x, mouse_y
cam_pos = self._base.camera.getPos()
self._base.camera.setPos(cam_pos[0] + delta_x, cam_pos[1], cam_pos[2] + delta_y)
@property
def film_size(self):
return self._film_size
Rendering ground grid:
def __render_ground_plane(self, scale: float = 1.):
self._plane_gn.removeAllChildren()
card_maker = CardMaker("ground")
card_maker.setFrame(-4000, 4000, -4000, 4000)
repeats = 8000 / (scale * 80)
card_maker.setUvRange((-repeats / 2, -repeats / 2), (repeats / 2, repeats / 2))
card_gn = card_maker.generate()
# card_maker.setFrameFullscreenQuad()
self._plane_gn.addChild(card_gn)
texture = self._base.loader.load_texture("./viewport/resources/ground_grid.png")
NodePath(card_gn).setTexture(texture)