• Как понимать бинарные файлы?

    reverse_kacejot
    @reverse_kacejot
    Junior C++ Developer, bachelor of Applied Math
    Как гласит страничка википедии для того же формата .3ds - "The first two bytes of the chunk are its ID". У каждого формата - свое бинарное представление со своими чанками. Типичным примером могут быть исполнимые файлы Windows - PE и для Linux - ELF. Для ELF-файлов есть хорошая спецификация, которая объясняет какие чанки бывают, какие у них заголовки, какие поля у заголовков, какой размер у чанком (если он не переменный).
    Еще есть spool файлы принтеров - у них тоже своих заголовки.

    Из общего, что можно вынести:
    В бинарном представлении информация не хранится в голом виде, а чаще всего обернута в блоки с заголовками. У заголовков могут быть идентификаторы (как те циферки, о которых ты спросил), размер блока и другая вспомогательная информация, которая зависит от спецификации заголовка.

    Обещанные ссылки на спеки бинарей:
    ELF - Executable and Linkable format
    EMFSPL
    EMF
    PE

    Вот нашел свой парсер секций для Portable Executable
    #include <stdio.h>
    #include <windows.h>
    
    #define RTN_OK 0
    #define RTN_FAILURE 1
    
    const size_t expected_count = 1;
    
    char* read_file_name(int argc, char** argv);
    
    int main(int argc, char** argv)
    {
    	// Parsing command line args
    	char* file_name = read_file_name(argc, argv);
    	
    	// Opening our executable
    	FILE* portable_executable = fopen(file_name, "r");
    
    	// Reading dos header
    	IMAGE_DOS_HEADER dos_header_buffer;
    	fread(&dos_header_buffer, sizeof(IMAGE_DOS_HEADER), expected_count, portable_executable);
    
    	// Setting offset for reading PE header
    	fseek(portable_executable, (long)dos_header_buffer.e_lfanew, SEEK_SET)
    
    	// Reading signature field from PE header
    	DWORD signature = 0;
    	fread(&signature, sizeof(DWORD), expected_count, portable_executable);
    
    	// Reading file header
    	IMAGE_FILE_HEADER file_header_buffer;
    	fread(&file_header_buffer, sizeof(IMAGE_FILE_HEADER), expected_count, portable_executable);
    
    	// Reading optinal header
    	IMAGE_OPTIONAL_HEADER optional_header_buffer;
    	fread(&optional_header_buffer, file_header_buffer.SizeOfOptionalHeader, expected_count, portable_executable);
    
    	// Get info about all the sections
    	for (int i = 0; i < file_header_buffer.NumberOfSections; ++i)
    	{
    		// Reading each section header
    		IMAGE_SECTION_HEADER section_header_buffer;
    		fread(&section_header_buffer, sizeof(IMAGE_SECTION_HEADER), expected_count, portable_executable);
    		
    		printf("Section name: %7s, Raw data size: %10d, Pointer to raw data: %10d\n",
    			section_header_buffer.Name,
    			section_header_buffer.SizeOfRawData,
    			section_header_buffer.PointerToRawData);
    	}
    
    	fclose(portable_executable);
    }
    
    char* read_file_name(int argc, char** argv)
    {
    	if (argc != 2)
    	{
    		return NULL;
    	}
    
    	return argv[1];
    }
    Ответ написан
    Комментировать
  • Можно по-подробнее насчет функции select в сокетах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    какие отличия recv/send от recvfrom/sendto?

    recvfrom возвращает адрес отправителя полученных данных. Имеет смысл с протоколами без соединения, типа UDP. sendto позволяет отправлять с одного сокета на разные адреса, опять же, имеет смысл с протоколами без соединения.
    В man про это написано.
    Ответ написан
    Комментировать
  • Солвер (расталкивание объектов) физического движка?

    DirecTwiX
    @DirecTwiX
    "display: flex;" уже предлагали?
    Про упругость верно сказали. Но есть упростить, то при столкновении скорость менять не как
    v2 = -v1

    а
    v2 = -k*v1, где 0<=k<=1


    k = 0 - абсолютно неупругое столкновение (мяч прилипнет)
    k = 1 - абсолютно упругое (будет бесконечно прыгать)
    Ответ написан
    Комментировать
  • Солвер (расталкивание объектов) физического движка?

    Griboks
    @Griboks
    Необходимо ввести такой параметр как упругость. Иногда его называют bounce material. Он показывает кпд столкновения с поверхность. Проще говоря, упругость определяет долю энергии, оставшуюся у объекта после коллизии.

    Сейчас у вас 100% упругость - абсолютно упругие тела. Но в реальности такого не бывает. Таким образом, скорость отскока должна уменьшиться пропорционально упругости сталкивающихся тел. Затем она ещё раз уменьшиться и ещё раз... А потом достигнет интервала дискретизации - тело остановится.

    Ещё нужно учесть сопротивление среды. Сама по себе скорость тела в свободном полёте должна уменьшаться (не учитывая 9.8). Это задаётся вязким трением.

    Короче говоря,
    1. провести честную симуляцию
    2. или интерполяцию между двумя положениями и найти наиболее близкое к соприкосновению поверхностей.
    Ответ написан
    Комментировать
  • Как отправить картинку браузеру?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Оба потока открыть в двоичном режиме.
    2. Операция << отправит наш PNG как ASCIIZ — то есть перестанет писать, когда попадётся нулевой символ. А надо целиком, командой write.
    Ответ написан
    Комментировать
  • Как отправить картинку браузеру?

    AlexanderYudakov
    @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Картинку не надо пытаться преобразовывать в строку. Ничего хорошего из этой идеи не выйдет.
    Сначала отправляем заголовки - строкой. А потом картинку - как массив байт.

    P.S. Заголовок Version - лишний.
    Ответ написан
    Комментировать
  • Индексы в поочередно в ячейки массива?

    Нужно заменить i * 4 на i * 3 + 1, а i * 5 на i * 3 + 2.
    Общий пример доступа к массиву по одному индексу. В этом случае нет необходимости проверять «i» на «0».
    int count = 3; // Количество столбцов в двумерном массиве
    int row = 2; // Номер строки в двумерном массиве
    int col = 2; // Номер столбца в двумерном массиве
    
    index[row * count + col] = 10;
    Ответ написан
    Комментировать
  • Повернуть точки квадрата?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Вместо Y - подставьте Z и получите то, что нужно Вам.

    Поворот вокруг центра:
    X = x * cos(alpha) — y * sin(alpha);
    Y = x * sin(alpha) + y * cos(alpha);

    Общая формула:
    X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0;
    Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;
    Ответ написан
    6 комментариев
  • Как перевести 3D в 2D?

    Если кустарно, то нужно сдвинуть и повернуть весь мир так, чтобы плоскость глаза игрока совпала с плоскостью монитора (т.е. с началом координат в центре монитора). После чего воспользоваться нехитрой формулой перевода из параллельной проекции в перспективную:

    X_на_мониторе = X_из_3D / Z_из_3D
    Y_на_мониторе = Y_из_3D / Z_из_3D

    Так я делал 15 лет назад, когда интернета и книжек у меня не было :)
    Ответ написан
    Комментировать
  • Как перевести 3D в 2D?

    lxsmkv
    @lxsmkv
    Test automation engineer
    похоже "проекция точки на плоскость" это то, что вы ищете.
    Ответ написан
    Комментировать
  • Какая биржа лучше?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    никакая

    оба хуже
    Ответ написан
    Комментировать
  • Const char to char* сейчас не компилирует?

    JaxxDexx
    @JaxxDexx
    Скорее всего стоит параметр компилятора /Zc:strictStrings
    Ответ написан
    1 комментарий
  • Как можно парсить DFF файлы?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Комментировать
  • Как создается единая физическая-графическая модель?

    @AlexSku
    не буду отвечать из-за модератора
    1) Есть библиотека PhysX у NVidia
    2) В Матлабе (Симулинк) есть 3D Анимация (3D-редактор), к которой можно привязать физику (много примеров)
    Ответ написан
    Комментировать
  • Как создается единая физическая-графическая модель?

    Griboks
    @Griboks
    Физический движок вообще никак не связан с графическим. Две разные программы. Даже сами объекты взаимодействуют через коллайдеры, а не через меши.
    Делается физика по упрощённым научным законам (f=am, x=x0+v0t+at^2/2).
    Ответ написан
    8 комментариев
  • Как создается единая физическая-графическая модель?

    profesor08
    @profesor08
    Вот у тебя есть фигура выкрученная-закрутень, ее модель очень сложная, много вершин (миллионы, почему нет). По понятным причинам просчитывать коллизии для всех ее вершин, в реальном времени - очень затратное дело. Чтоб решить эту проблему, ты берешь куб размером с основную фигуру. И проверяешь коллизии для него. Если коллизия произошла, ты можешь как-то обработать этот момент уже для самой фигуры, проиграть какую-то анимацию.
    Ответ написан
    Комментировать
  • Как создается единая физическая-графическая модель?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    И почему крупные компании не могут реализовать свою такую технологию, а покупают ее у других?

    Ответ будет таков
    5a2b8fc21c685856187802.jpeg

    Если компания крута, она, как мыслящий организм, прекрасно поймет, на что время тратить разумно, а на что - нет.

    А почему так мало игр ее использует?

    Скажем прямо, с "еще парой игр" ты слегка промахнулся, ведь Morpheme и Euphoria от Natural Motion используется далеко не в паре просто игр. Полный список игр не раскрывается и не может быть раскрыт по простым причинам своей масштабности. Это очень распространенный и очень мощный инструмент.

    Теперь стал интерисовать вопрос - как прикрутить к этому всему физику.

    Это архитектурные вопросы. Решение очень сильно зависит от того, как у тебя построена математическая модель мира. Мат. модель производит связь в принципе всех компонентов мира между собой.
    Для снижения трудоемкости операций, сетку коллизии нередко делают более разреженной, нежели сетку графической модели. Бывает, что это никак не сказывается на внешнем виде модели. Бывает, что это сильно сказывается. По своей форме коллизионная модель очень часто и очень сильно отличается от графической.

    Нередко модели коллизии и физики представлены разными подсистемами и работают с разными данными для одного и того же графического объекта. Это сделано для того, чтобы физику считать на более простых моделях, а более деликатные моменты обсчитывать уже после подтверждения физического контакта и с применением более детальных данных об объекте.

    Тебе стоит представить сцену как набор параллельных пространств. Одно пространство ты видишь. Другое - можешь только потрогать. Третье пространство лишь ощущается как набор сил, действующих на тебя. Есть еще много таких пространств, некоторые из них и вовсе недоступны для нормального представления.
    Пространство анимаций никак не связано с графическим пространством, но косвенно влияет на деформации объекта в графическом пространстве. Все дело в том, что и пространств анимации может быть несколько. Физическое пространство может оказывать влияние на анимации, эту связь лучше выделить в отдельное пространство со своими правилами.
    Все пространства наделяют объект своими свойствами благодаря работе мат. модели мира.

    Более подробно можно узнать в соответствующих источниках. Нужна секция: "Game engine development".
    Часть этих книг есть в русском переводе.
    Ответ написан
    Комментировать