Небольшое расширение предыдущего урока. Будем реализовывать непосредственно класс, позволяющий клацать по поверхности террайна мышью. Располагаться он у нас будет сё в том же control.py Полный текст класса: Code class mouseControl(DirectObject): def __init__(self): self.picker = CollisionTraverser() self.pickerQ = CollisionHandlerQueue() pickerCollN = CollisionNode('mouseRay') pickerCamN = base.camera.attachNewNode(pickerCollN) pickerCollN.setFromCollideMask(BitMask32.bit(1)) pickerCollN.setIntoC ollideMask(BitMask32.allOff()) self.pickerRay = CollisionRay() pickerCollN.addSolid(self.pickerRay) self.picker.addCollider(pickerCamN, self.pickerQ) self.accept('mouse1',self.pick) def pick(self): if base.mouseWatcherNode.hasMouse(): mpos = base.mouseWatcherNode.getMouse() self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY()) self.picker.traverse(render) print self.pickerQ.getNumEntries() for i in xrange(self.pickerQ.getNumEntries()): entry=self.pickerQ.getEntry(i) print 'entry '+str(entry.getSurfacePoint(render)) Как видите, процедура инициализации, практически идентична той, которую мы писали для класса heightChecker, за одним исключением — в конце мы добавляем событие реакции на нажатие мыши и для этого наш класс должен наследоваться от DirectObject. Процедура, которая будет выполняться по клику — pick. Снова мы это видели, только в процедуре управления камерой — мы проверяем находится ли мышь в нашем окне и в положительном случае получаем её как объект из которого потом выковыряем её экранные координаты. А теперь новое для нас Code self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY()) Этим мы устанавливаем ориентацию луча таким образом, что он начинается от камеры и проходит через точку, лежащую на экранной плоскости. Соответственно, точкой у нас является курсор мыши, а в результате, мы получаем луч, уходящий в бесконечность в нужном нам направлении. Дальше снова уже знакомый код — запускаем рассчёт столкновений; выводим количество вхождений; в цикле проходим по всем полученным вхождениям и выводим координаты каждого вхождения. Для проверки в главном файле экспортируем наш класс Code from modules.control import mouseControl и создаём его экземпляр
|