🪧 Отсечение текста двусторонних табличек (Minecraft 26.2)
В Minecraft 26.2 таблички поддерживают двусторонний рендеринг текста. Движок рендеринга шрифтов отрисовывает полигоны глифов, цвета и контуры свечения на обеих сторонах одновременно.
Camera Culling устраняет ненужные проходы рендеринга текста с помощью скалярного произведения вектора нормали грани ($\vec{N} \cdot \vec{V}$) и быстрого пропуска пустого текста.
📋 Инфобокс отсечения текста табличек
| Свойство | Значение |
|---|---|
| Целевой конвейер | BlockEntityRenderDispatcher.tryExtractRenderState @At("RETURN") |
| Хук API | signState.frontText = null; / signState.backText = null; |
| Поддерживаемые типы | Настенные, напольные, настенные подвесные и потолочные подвесные таблички |
| Пропуск пустого текста | Автоматически пропускает пустые стороны без видимых символов |
| Допуск скалярного произведения | Погрешность $\pm 0.05$ предотвращает появление текста на острых углах |
📐 Математика скалярного произведения нормали вектора
Чтобы определить, направлена ли лицевая или обратная сторона таблички к камере, Camera Culling рассчитывает скалярное произведение вектора нормали грани $\vec{N} = (N_x, N_z)$ и вектора от центра таблички к камере $\vec{V} = (V_x, V_z)$:
$$V_x = X_{\text{cam} - (X_{\text{sign} + 0.5), \quad V_z = Z_{\text{cam} - (Z_{\text{sign} + 0.5)$$
1. Настенные таблички (WallSignBlock.FACING) и подвесные настенные таблички
Вектор нормали напрямую берется из шаговых смещений направления блока Direction: $$N_x = \text{facing.getStepX()}, \quad N_z = \text{facing.getStepZ()}$$
2. Напольные таблички (StandingSignBlock.ROTATION) и потолочные подвесные таблички
Поворот представлен целым числом $0 \dots 15$. Угол $\theta$ в радианах рассчитывается: $$\theta = \left(\frac{\text{rotation} \times 360^\circ}{16}\right) \times \frac{\pi}{180}$$ $$N_x = -\sin\theta, \quad N_z = \cos\theta$$
3. Определение видимости
Скалярное произведение $D$ оценивает угол наблюдения: $$D = N_x V_x + N_z V_z$$
- Оценка лицевой грани: Отсекается, когда $D < -0.05$ (Камера находится позади плоскости таблички).
- Оценка задней грани: Отсекается, когда $D > 0.05$ (Камера находится перед плоскостью таблички).
⚡ Быстрый проход пустых сторон
Если игрок написал текст только на одной стороне таблички (или поставил табличку без текста в качестве декоративного барьера), Camera Culling проверяет 4 строки текста:
public static boolean isTextEmpty(SignText text) {
if (text == null) return true;
for (int i = 0; i < 4; i++) {
Component msg = text.getMessage(i, false);
if (msg != null && !msg.getString().trim().isEmpty()) {
return false;
}
}
return true;
}Пустые стороны мгновенно обнуляются без лишних тригонометрических расчетов и вычисления скалярного произведения.
