Примитивное управление камерой в Ogre3D

Задача: камера должна наблюдать за объектом, быть на расстоянии 5 метров от него и не менее 2.5 метров над землей.

Решение:

void initialise()
{
    // Включаем слежение за объектом
    camera->setAutoTracking(true, target)
}
 
void update()
{
    // Нормаль направления цели
    Vector3 targetDir = target->getOrientation() * Vector3::UNIT_Z).normalisedCopy();
    // Позиция цели
    Vector3 targetPos = target->getPosition();
    // Позиция камеры
    Vector3 cameraPos = camera->getPosition();
    // Нормаль от цели к камере
    Vector3 targetToCameraDir = (cameraPos - targetPos).normalisedCopy();
 
    // Ставим камеру в координаты цели
    cameraPos = targetPos;
    // Сдвигаем камеру в направлении targetToCameraDir на 5 метров
    cameraPos += 5.0f * targetToCameraDir;
    // Регулируем высоту камеры
    cameraPos.y = std::max(2.5f, cameraPos.y);
 
    // Обновляем позицию камеры
    camera->setPosition(cameraPos);
}
Программируем робота

Постаревшие школьники, которые программировали черепашку на уроках информатики, оценят по достоинству. :)

Light bot

Крутая система логгирования

Эта заметка была написана в моем втором по счету блоге на сайте blogspot два года назад. Сейчас я уже пришел к пониманию, что такая система логов мне не нравится. Она довольно навороченная, но все эти шаблоны меня теперь почему-то пугают. Дабы это добро не сгинуло вместе с тем дневником, публикую здесь. Прочитав данную статью, возможно, вы сможете подцепить тёлочку блеснуть умом в узких кругах. :)

Полгода назад мы создавали крутой логгер, использование которого выглядело так:

logger::info() << "Тестовое сообщение номер " << 1;

Самая главная проблема была в том, чтобы воткнуть ‘\n’ в конце сообщения. Для этого в info() был примерно следующий код:

InfoStream info()
{
    static InfoStream stream;
    // std::endl пишет в ostream '\n' и делает flush()
    stream << std::endl;
    return stream;
}

Последняя строка завершалась только при закрытии файла (в деструкторе класса InfoStream). Первый flush игнорировался. Это все кажется простым, если мы пишем лог в обычный текстовый файл.

Когда лог стал в формате html, начались пляски с бубном.

Во-первых, в html надо записать заголовок, во-вторых, красиво оформить начало строки, в-третьих, красиво закончить строку, в-четвертых, вставить теги в конце файла. Это было реализовано, но совместимость между использованием текстового лога и html в некотором смысле пропала (базовый класс для обоих типов выглядел монстром).

Совсем недавно пришлось копаться во внутренностях. Задача стояла — вынести этот логгер в отдельный набор заголовков а-ля boost. Посмотрев на этот код, я плюнул и решил написать логгер заново. :)

Вот как это было реализовано:

class logger
{
public:
    class internal_stream
    {
    public:
        template <class T>
        internal_stream & operator <<(const T & value)
        {
            logger << value;
            return *this;
        }
 
        ~internal_stream() {}
 
    private:
        // Может использоваться только классом logger
        internal_stream(logger & stream) 
            : mStream(stream)
        {};
 
        logger & mStream;
    };
 
    internal_stream info()
    {
        return internal_stream(*this);
    }
};

Как это все работает:

  • в конструкторе logger — подготавливаем файл для записи, в текстовом ничего не делаем, в html — записываем заголовок
  • в деструкторе logger — закрываем файл, в html формате закрываем теги body, html и т.д.
  • в конструкторе internal_stream — начало строки, в html формате пишем tr, td и все что нравится
  • в деструкторе internal_stream — окончание строки, в текстовом это просто ‘\n’, в html закрываем теги tr и т.д.

Если сделать logger шаблонным классом, то можно реализовать разные буферы вывода. Начиная от текстового, html и xml и заканчивая сервером для приема и клиента для отправки сообщений по сети.

о. Кос, Греция. Отель «Oceanis Beach Resort»

По прилету на остров Кос нас разместили в отеле «Oceanis Beach Resort». Отель довольно старый, но уютный. Всюду травка зеленеет, пальмы растут. Отель называется по-разному: где-то написано «Blue Oceanis», где-то «Oceanis Beach».

Остров Кос. Отель Oceanis Beach Resort

Номер

В номере, при вселении, нас ждала бутылка вина и фрукты. Вино надо выпить, а фрукты съесть. Это подарок. Некоторые туристы этого не знают и спрашивают про вино у гида только под конец отпуска. Мы скромничать не стали — схарчили фрукты и допили вино в первый же день.

Питание

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

Oceanis Beach Resort. Внутренний двор отеля.

В один прекрасный вечер в отеле был какой-то праздник, посвященный Греции. В связи с этим каждому выдавали стопку «Узо» на входе и фотографировали на память. Так вот, выпивать водку сразу же и занюхивать рукавом, как сделал я — не надо, не палитесь! Иначе сразу последует вопрос: «Are you russian?». Оказывается, эту стопку надо взять с собой и пить ее во время ужина. Хотя, если употребить сразу при входе, то вам нальют еще одну. Ее я тоже хотел выпить тут же, не отходя, что называется, от кассы, но мои спутницы утащили меня ужинать от греха подальше. А ведь могла бы быть еще и третья стопка, но не срослось.

Бассейн

Так же в отеле есть аж три бассейна: два с соленой водой и один с пресной. Купаться в них можно только с восьми утра до восьми вечера. Об этом сообщает табличка на трех языках: немецком, греческом и английском. Мы грамоте тамошней не обучены, поэтому купались с восьми вечера до двух часов ночи.

Отель Oceanis Beach Resort. Вечерние бассейны

Правила мы нарушали аккуратно, купаясь в бассейне тихо, как мышки. В отличие от дебилов-немцев, которые мало того, что игнорировали надпись на их родном языке, так еще орали и шумели ночью в бассейне. А уходя кинули в него шезлонг. Может это юмор какой немецкий — непонятно. Хотелось подойти к ним, тихо сказать «Hitler kaput» и закатить в табло.

Бар

Часов с семи-восьми вечера в отеле, недалеко от входа, открывался бар. Главное украшение этого бара — бармен. Приятный во всех отношениях дядька. Если открыть энциклопедию на слове «Хороший бармен», там вы увидите это фото.

Настоящий греческий бармен

В баре рекомендую попробовать «Узо», греческую водку. Она вкусно пахнет «Пертусином» и пьется как «Пертусин» нектар. Стандартный способ питья: маленькими глоточками потягивать из стакана. Но можно взять трубочку и растянуть удовольствие. Бармен поначалу удивлялся такой манере пить местную водку, но потом привык.

Что интересно — в Греции город Санкт-Петербург называют «Petropolis», а в Финляндии — «Pietari». Так что в Грецию вы едете петрополисцем, а в Финляндию пиетарасом пиетарцем, будьте бдительны.

О полете в Грецию можно почитать в в первой части, а про экскурсию во второй части.

Блог Евгения Жирнова