Я продлил хороший ответ, заданный @ renato-chandelier, обеспечив поддержку:
_NIBBLE_(…)
- 4 бит, 1 nibble в качестве аргумента _BYTE_(…)
- 8 бит, 2 глыбы в качестве аргументов _SLAB_(…)
- 12 бит, 3 глыбы в качестве аргументов _WORD_(…)
- 16 бит, 4 куска в качестве аргументов _QUINTIBBLE_(…)
- 20 бит, 5 глаголов в качестве аргументов _DSLAB_(…)
- 24 бит, 6 кусков в качестве аргументов _SEPTIBBLE_(…)
- 28 бит, 7 грызков в качестве аргументов _DWORD_(…)
- 32 бит, 8 глаголов в качестве аргументов На самом деле я не очень уверен в терминах «quintibble» и «septibble». Если кто-нибудь знает какую-либо альтернативу, пожалуйста, дайте мне знать.
Вот макрос, переписанный:
#define __CAT__(A, B) A##B
#define _CAT_(A, B) __CAT__(A, B)
#define __HEX_0000 0
#define __HEX_0001 1
#define __HEX_0010 2
#define __HEX_0011 3
#define __HEX_0100 4
#define __HEX_0101 5
#define __HEX_0110 6
#define __HEX_0111 7
#define __HEX_1000 8
#define __HEX_1001 9
#define __HEX_1010 a
#define __HEX_1011 b
#define __HEX_1100 c
#define __HEX_1101 d
#define __HEX_1110 e
#define __HEX_1111 f
#define _NIBBLE_(N1) _CAT_(0x, _CAT_(__HEX_, N1))
#define _BYTE_(N1, N2) _CAT_(_NIBBLE_(N1), _CAT_(__HEX_, N2))
#define _SLAB_(N1, N2, N3) _CAT_(_BYTE_(N1, N2), _CAT_(__HEX_, N3))
#define _WORD_(N1, N2, N3, N4) _CAT_(_SLAB_(N1, N2, N3), _CAT_(__HEX_, N4))
#define _QUINTIBBLE_(N1, N2, N3, N4, N5) _CAT_(_WORD_(N1, N2, N3, N4), _CAT_(__HEX_, N5))
#define _DSLAB_(N1, N2, N3, N4, N5, N6) _CAT_(_QUINTIBBLE_(N1, N2, N3, N4, N5), _CAT_(__HEX_, N6))
#define _SEPTIBBLE_(N1, N2, N3, N4, N5, N6, N7) _CAT_(_DSLAB_(N1, N2, N3, N4, N5, N6), _CAT_(__HEX_, N7))
#define _DWORD_(N1, N2, N3, N4, N5, N6, N7, N8) _CAT_(_SEPTIBBLE_(N1, N2, N3, N4, N5, N6, N7), _CAT_(__HEX_, N8))
И вот пример использования Ренато:
char b = _BYTE_(0100, 0001); /* equivalent to b = 65; or b = 'A'; or b = 0x41; */
unsigned int w = _WORD_(1101, 1111, 0100, 0011); /* equivalent to w = 57155; or w = 0xdf43; */
unsigned long int dw = _DWORD_(1101, 1111, 0100, 0011, 1111, 1101, 0010, 1000); /* Equivalent to dw = 3745774888; or dw = 0xdf43fd28; */
1 единица измерения Unity обычно считается равной 1 метру, однако, как только вы прочитали, это зависит от вашей реализации, в этом случае похоже, что вы на самом деле экспортируете из САПР с единицей 1 дюйм = 1, поскольку ваши результаты кажутся похоже, но немного не так.
Причина, по которой вы получаете неточности, заключается, скорее всего, в том, что система столкновений Unity не очень точная, большинство коллайдеров на самом деле немного больше, чем сетка, которую они представляют, что значительно отбросит ваши точно настроенные измерения, и вдобавок к этому Точность Unity будет намного ниже, чем у САПР, поскольку Unity - игровой движок, который должен работать в режиме реального времени, данные о 3D-координатах не очень точны (примерно с 4 цифрами они становятся довольно туманными), а на самом деле значительно ухудшаются во время путешествий. вдали от источника.
Я бы не советовал пытаться использовать Unity для каких-либо точных проектных работ, особенно при представлении реального мира, но если вы не уверены, что вы можете увеличить ваши объекты в 10 или 100 раз чтобы держать ваши цифры ближе к десятичной запятой, чтобы уменьшить ошибку с плавающей запятой, это, очевидно, хак.
Возможно, вы также захотите взглянуть на свои настройки физики: https://docs.unity3d.com/Manual/class-PhysicsManager.html В частности, может иметь значение «Смещение контакта по умолчанию» (хотя я я не уверен, влияет ли это на raycasts)
PS: я бы опубликовал это в качестве комментария, но система повторов не позволит мне, ваше описание измерений между каждой средой действительно сбивает с толку, возможно, в следующий раз Попробуйте отформатировать его в виде таблицы или еще чего-нибудь?