a = own.getAxisVect(Vector((0,0,1)))sled.alignAxisToVect(a,0,1)sled.worldPosition = own.worldPosition
a = sled.getAxisVect(Vector((0,0,1)))obj,point,normal = sled.rayCast(sled.worldPosition-a*2)
sled.worldPosition = point+a*0.03
...... а как у тебя с арматурной анимацией в Blender, с Physics и Rigid Body без BGE пробовал? https://docs.blender.org/manual/ru/dev/physics/index.html#physics-typeshttps://docs.blender.org/manual/en/dev/physics/rigid_body/index.html...
>>> a = own.getAxisVect(Vector((0,0,1))) Вектор выравнивания по оси Х? В чём смысл?>>> obj,point,normal = sled.rayCast(sled.worldPosition-a*2) - что это за значение "-a*2", в чём его смысл?>>> sled.worldPosition = point+a*0.03 - а это значение "a*0.03" получено методом "научного тыка"? Работает сразу по трём осям?... представь, что происходит во время движения колеса с осями Z и Y - они вращаются вокруг оси X, а ось X перпендикулярна плоскости,в которой вращается колесо и эта плоскость вертикальна к поверхности (с небольшим наклоном) ...... то есть базироваться по другим осям кроме X смысла нет ... Кодa = own.getAxisVect(Vector((0,0,1)))sled.alignAxisToVect(a,0,1)sled.worldPosition = own.worldPosition
>> я не спорю с тобой – я уточняю правильность своего понимания.... у меня нет стопроцентной уверенности, код, который представил, результат экспериментов на понимание ...... возможно что есть решение в другой последовательности, думаю вместе разберёмся ...
... давай вместе порассуждаем ...... на левой картинке - колесо и две точки касания, А - точка касания середины колеса (допустим поверхность под таким наклоном) и B - точка касания, которую отдаёт обратный вызов коллизии (нарисованный след в ней выглядит нелепо, поскольку точки могут быть и слева и справа) ...... на правой картинке тоже не очевидно куда пускать луч для определения точки соприкосновения (вниз или ?) ...
... внизу моё представление о скольжении куба и качении шара по наклонной плоскости ...
... после того как выровняли след по X получаем от него вектор, который направлен по Z (причём это не глобальный Z, а именно Z локальный с учётом наклона следа, то есть плоскость, в которой лежит след перпендикулярна плоскости в которой вращается колеса) и стреляем в этом направлении в сторону поверхности на два расстояния длины этого вектора и по направлению этого вектора ...... по идее нужно стрелять на радиус колеса с небольшим запасом, но суть в том что длина вектора 1 и радиус вектора 1, то две длины вектора это двойной запас ...
Кодa = sled.getAxisVect(Vector((0,0,1)))obj,point,normal = sled.rayCast(sled.worldPosition-a*2)... в идеале и с математической стороны можно просто переместить след в point, но тогда во время его отрисовки он будет перекрываться поверхностью, то есть его следует поднять на минимально приемлемое расстояние над поверхностью ...... но поднимать его нужно не по оси Z, а по направлению нормали к поверхности, а это вектор "a" ...
Кодsled.worldPosition = point+a*0.03>> получено методом "научного тыка"... 0.03 получено скорее методом "экспертная оценка", если бы след гарантированно попадал только в один полигон поверхности, то можно было бы использовать минимально вменяемое значение 0.001, но в твоём случае это бы съело часть следа неровностью смежных полигонов поверхности ...
>> Вектор «а» имеет положительное направление по оси Z, потому и минусуем?... вектор «а» он в большинстве случаев смотрит примерно вверх, а нужно пустить луч вниз к поверхности ...
... мне через 20 минут коптильню снимать ...
>> Можешь поделиться своими соображениями, которыми пользовался создавая след за своим вездеходом?... а ты смотрел мувик в конце этого поста http://blender-3d.ru/forum/index.php/topic,2090.msg29474.html#msg29474 это и есть мои соображения на твой вопрос ...
import bgefrom mathutils import Vector# из модуля mathutils импортировать Vector z = Vector((0,0,1))def init(): # объявление глбальных переменных global sc # сцены global wl # колеса global sl # следа global gr # поверхности print("Init app\n\n\n") # назначение глбальных переменных sc = bge.logic.getCurrentScene() # сцены sl = sc.objectsInactive['sled'] # следа wl = sc.objects['wheel'] # колеса gr = sc.objects['ground'] # поверхности gr.collisionCallbacks.append(callback) # вызов процедуры callback ??? def callback(object, point, normal): ob = sc.addObject(sl) # добавить объект следа в сцену a = wl.getAxisVect(z) # вектор луча исходящий от колеса ob.worldPosition = object.worldPosition-z # позицию следа установить от позиции колеса за вычетом вектора луча ob.alignAxisToVect(a,0,1) # выверить след согласно вектору исходящего от колеса