import bgefrom mathutils import Vector# из модуля mathutils импортировать Vector 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) def callback(object, point, normal): ob = sc.addObject(sl) a = wl.getAxisVect(Vector((0,0,1))) ob.worldPosition = object.worldPosition+Vector((0,0,-1)) ob.alignAxisToVect(a,0,1)
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) def callback(object, point, normal): ob = sc.addObject(sl) a = wl.getAxisVect(z) ob.worldPosition = object.worldPosition-z ob.alignAxisToVect(a,0,1)
>> Ладно, помоги хоть найти ответы на более простые вопросы, которые уже мною заданы.... только без паники, повторите вкратце суть вопросов ...... так или иначе постараемся найти на них решение ... >> Очень похоже что я рано в эти дебри свой нос сунул.... в чем предмет опасения? ...... посмотри функцию alignAxisToVect, если у тебя есть нормаль к поверхности, то попробуй выровнять след по ней ...
https://docs.blender.org/api/blender_python_api_2_77_0/bge.types.KX_GameObject.html?highlight=alignaxistovect#bge.types.KX_GameObject.alignAxisToVect http://bgepython.tutorialsforblender3d.com/GameObject/alignAxisToVect
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) def callback(object, point, normal): ob = sc.addObject(sl) a = wl.getAxisVect(z) ob.alignAxisToVect(a,0,1) a = ob.getAxisVect(z) ob.worldPosition = object.worldPosition obj,point,normal = ob.rayCast(ob.worldPosition-a*2) if obj: print(point) ob.worldPosition = point+a*0.03 ob.alignAxisToVect(normal,2,1)
from bge import logic as L # из модуля bge импортировать logic как Lfrom mathutils import Vector# из модуля mathutils импортировать Vector cont = L.getCurrentController()# получить активный контроллерown = cont.owner # получить объект Koleso - владелец контроллераpos = own.worldPosition # получить позицию колесаprint("6 pos = ", pos) # scn = own.scene # получить активную сцену Sceneinobjs = scn.objectsInactive # получить неактивный объект [Plane]print("9 inobjs = ", inobjs) # #вычисление скорости движения объектаsm = own.get("oldPos", pos) - posprint("12 sm = ", sm) # spd = (sm.x ** 2 + sm.y ** 2) ** 0.5own["oldPos"] = pos.copy() # .copy() - копирует векторprint("15 own[oldPos] = ", own["oldPos"], " spd = ",spd) # ###########настройки#############sled = 'Plane' # имя объекта-следа, он находится на скрытом слоеspeed = 0.01 #скорость, требуемая для активации################################if sled in inobjs and spd >= speed: #если есть объект-след на скрытом слое, а скорость больше или равна указанной sled = scn.addObject(inobjs[sled]) # добавить след в сцену a = own.getAxisVect(Vector((0,0,1))) sled.alignAxisToVect(a,0,1) a = sled.getAxisVect(Vector((0,0,1))) sled.worldPosition = own.worldPosition obj,point,normal = sled.rayCast(sled.worldPosition-a*2) if obj: sled.worldPosition = point+a*0.03 sled.alignAxisToVect(normal,2,1) print("25 sled.worldPosition = ", sled.worldPosition) # print(" = ")
>> Насколько я понял, нормаль поверхности в точке соприкосновения ведь не определена, а, следовательно, пока преждевременно след располагать на поверхности?... ответ не однозначен (для меня) - значение точки соприкосновения и нормали формируется во время обратного вызова при обработке коллизии https://docs.blender.org/api/2.79/bge.types.KX_GameObject.html?highlight=collisioncallbacks#bge.types.KX_GameObject.collisionCallbacks ...... насколько это значения тебя устроят?! сомневаюсь что полностью ...
>> Выравнивание оси игрового объекта по мировому вектору.>> alignAxisToVect(vect, axis, fac – скобка не закрыта из-за опечатки?... где приведён такой текст? ...
>> vect – в моём случае (0.0, 0.0, -1.0)? Отрицательное направление оси Z... обрати внимание на этот топик http://blender-3d.ru/forum/index.php/topic,326.msg4308.html#msg4308 ...... тебя не должно это пугать ...... если у тебя есть z = Vector(0,0,1) , то чтобы получить Vector(0,0,-1) нужно просто использовать -z ...... в целом в коде у тебя векторные операции будут выглядеть как a = b+c ...
>> Всё дело в том, что я действительно не программист.... какой вид деятельности? если не секрет ...
... страх, негативный опыт, отрицательная практика или бытовое отвращение к этой категории?
... пиши больше мелких вопросов и типа "делаю это, не получается" ...... и выкладывай больше кода и промежуточные модели, это значительно ускоряет решение проблем ...
... http://bgepython.tutorialsforblender3d.com/ - попробуй использовать те примеры, которые уже решены и хорошо себя показали, и в части этой позитивной практики можешь комбинировать элементы этих решений в своих целях ...
>> Строка b.normalize() позволяет определить нормаль для вектора b?... нет ...
>> Мне необходима нормаль к части поверхности (плоскости) в определённой точке.... для этого есть rayCast - от объекта исходит луч в сторону поверхности, в ответ получаешь точку соприкосновения и нормаль ...
import math # импортировать модуль mathfrom bge import logic as L # из модуля bge импортировать logic как Lfrom mathutils import Vector# из модуля mathutils импортировать Vector from mathutils import Euler # импортировать функцию Euler из модуля mathutils cont = L.getCurrentController()# получить активный контроллерown = cont.owner # получить объект Koleso - владелец контроллераpos = own.worldPosition # получить позицию колесаprint("8 pos = ", pos) # scn = own.scene # получить активную сцену Sceneinobjs = scn.objectsInactive # получить неактивный объект [Plane]# print("11 inobjs = ", inobjs) # #вычисление скорости движения объектаputy = own.get("oldPos", pos) - pos # вектор разности между предыдущей и текущей позицией следа# print("14 puty = ", puty) # spd = (puty.x ** 2 + puty.y ** 2) ** 0.5 # пройденный путь колесомown["oldPos"] = pos.copy() # .copy() - копирует векторprint("17 spd = ",spd) # ###########настройки#############sled = 'Plane' # имя объекта-следа, он находится на скрытом слоеspeed = 0.01 # скорость, требуемая для активацииvect = 0, 0, 1 # вектор лучаdist = 2.1 # длина луча################################print("25 pos = ", pos)print("26 own.getAxisVect(vect) = ", own.getAxisVect(vect))obj, hit, norm = own.rayCast(pos + own.getAxisVect(vect) * dist)print("28 obj = ", obj, " hit = ",hit, " norm = ",norm) #
>> Поздно заинтересовался 3D графикой – собственно вынужденно заинтересовался.... ранее задавал вопрос "зачем это нужно, какая цель преследуется" ...... поясни всё-таки зачем тебе 3D, возможно что так будет легче подобрать решение, ты же технолог должен понимать что и в 3D есть разные технологические приёмы, используемые оснастки ...
[quote author=Николай Николаев link=topic=2090.msg29485#msg29485 date=1522472304][/quote][color=green]Николай, в этой строке что за переменная получается?[/color] a = own.getAxisVect(Vector((0,0,1)))[color=green]Вектор выравнивания по оси Х? В чём смысл?[/color] sled.alignAxisToVect(a,0,1) a = sled.getAxisVect(Vector((0,0,1))) sled.worldPosition = own.worldPosition obj,point,normal = sled.rayCast(sled.worldPosition-a*2) [color=green]- что это за значение "-a*2", в чём его смысл?[/color] if obj: sled.worldPosition = point+a*0.03 [color=green]- а это значение "a*0.03" получено методом "научного тыка"? Работает сразу по трём осям?[/color] sled.alignAxisToVect(normal,2,1) print("25 sled.worldPosition = ", sled.worldPosition) # print(" = ")