Camera
Камера позволяет делать снимки экрана или даже отображать видео с мира на дисплее! Картинка с нашей камеры выглядит великолепно, даже не прибегая к трассировке лучей. Трассировки лучей не происходит! Просто лучи, идущие повсюду, как мультикаст!
Это даже не сложная математика! Просто сложение, вычитание, деление и умножение.
Камеры в ScrapComputers используют многоадресную рассылку для получения кадра или видео. Однако raycast в Scrap Mechanic, к которым у нас (моддеров) есть доступ, работает медленно. Это потому, что (если верить VeraDev) raycast обрабатывается процессором. Если бы это делала видеокарта, это не заняло бы много времени.
Чем больше разрешение, тем больше кадр. Тем больше времени потребуется, чтобы отправить все эти лучи. Вы можете посчитать, сколько лучей вы собираетесь использовать, просто используя простые математические вычисления. Формула для расчета: ширина*высота
.
Нам нужно сделать многоадресную рассылку, поскольку другого способа сделать это нет. Итак, если вы собираетесь использовать камеру и ваша игра зависает при получении кадра/видео, значит, ваш процессор занят расчётами.
Структуры
PixelRayResult
Это либо исходный результат raycast пикселя, либо его модифицированная безопасная версия, если в конфигураторе включен безопасный режим скриптов. В режиме небезопасной среды вы будете получать результат raycastResult, пожалуйста, смотрите раздел raycastResult для получения дополнительной информации.
Если скрипт выполняется в безопасной среде, исходный результат игры raycastResult модифицируется, и важные данные возвращаются в виде таблицы:
{
directionWorld = raycastResult.directionWorld, -- Направление в мире
fraction = raycastResult.fraction , -- Доля
normalLocal = raycastResult.normalLocal , -- Относительная нормаль
normalWorld = raycastResult.normalWorld , -- Абсолютная нормаль
originWorld = raycastResult.originWorld , -- Абсолютная координата начала raycast
pointLocal = raycastResult.pointLocal , -- Относительная координата цели
pointWorld = raycastResult.pointWorld , -- Абсолютная координата цели
type = raycastResult.type , -- Тип
valid = raycastResult.valid , -- Корректность raycast
material = material , -- Материал земли, если raycast попал в неё
color = color -- Цвет цели (если он существует)
}
DrawerFunction
Функция отрисовки - это функция, которая получает оригинальный результат raycast'а и отрисовывает его на дисплее. С помощью неё вы можете изменить принцип отрисовки кадра.
Аргументы:
- hit [ boolean ] Raycast попал куда-нибудь или нет.
- raycastResult [ PixelRayResult ] Результат луча raycast'а.
- x [ number ] X-координата текущего пикселя.
- y [ number ] Y-координата текущего пикселя.
Функция отрисовки должна быть написана следующим образом:
local function DrawerFunction(hit, raycastResult, x, y)
--[[ваш код здесь]]
return color -- может быть sm.color или цветом в шестнадцатеричном формате
end
Пример функции отрисовки, который делает изображение, полученное с помощью функции depthFrame:
local function DrawerFunction(hit, raycastResult, x, y)
local color = sm.color.new(0, 0, 0)
if hit then
color = sm.color.new(1, 1, 1) * (1 - result.fraction)
end
return color
end