PDA

Просмотр полной версии : [Papervision] Интерактивный глобус


Dzo
02.07.2009, 23:28
Добрый день!

Намутил я значит вот такой глобус: http://jvoliz.info/iGem/test.swf

ВНИМАНИЕ: Весит много - 1 мегабайт и требует новую версию flash'a (мне для огненной лисы пришлось скачать свежий плагин).

Ничего такой глобус вроде : )

Вопрос: как сделать, каждую (ну не каждую, а хотя бы десяток) стран интерактивными. То есть я подвожу мышкой к стране, ее контуры подсвечиваются или просто, чтобы я мог кликнуть по стране на глобусе и получить какое-то действие.

Я много гуглил и ничего дельного не нашел.

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

Собственно ряд вопросов:

* если взаимодействовать не напрямую с картой глобуса, а утыкать его какими-нибудь посторонними маркерами, то как привязать к DisplayObject3d событие. Чувствую, что никак, поэтому как сделать тоже самое, но без DisplayObject3D?

* Если все-таки хочется "порезать" карту на нужные мне участки и к каждому привязать ивент, как сделать?

* Вообще, как создать фигуру со сложным контуром и добавить ее в сцену?

Спасибо!

JD

Mur4ik
03.07.2009, 05:15
События привязываются через InteractiveScene3DEvent (http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/index.html)

Вот еще некий пример почти по теме (http://blog.zupko.info/?p=221)

А вообще, кажется, слишком сложную для себя Вы задачу выбрали для начала.

2morrowMan
03.07.2009, 12:27
Что с управлением ? Оно для дистрофиков ? :)

Dzo
03.07.2009, 12:44
Нормальную задачу! Дайте направление куда копать и мы раскопаем!

А что с управлением?

JD

Mur4ik
03.07.2009, 15:42
Я Вам уже дал направление куда копать.
Начните с документации, конкретнее обратите внимание на классы:
InteractiveScene3DEvent
InteractiveSceneManager
InteractiveUtils
Mouse3D

Вообщем то способов добиться того чего вы хотите есть несколько. Самый простой это MovieMaterial, т.е материал в виде мувиклипа интерактивного, но на производительности это сказывается не очень то положительно. Дальше уже варианты посложнее, ройте.

А на счет управления почитайте про Quaternion и что такое Gimble lock

yorlin
03.07.2009, 16:06
Да с управлением норм, только как то когда тянешь вниз глобус он вращается вверх, да и текстура, как всегда кольчужно на полюсах накладывается...(((
Smooth установил? а то какой то на краях ребристый...

ЛяЛя
07.09.2010, 23:18
здравствуйте! вот возникла такая же задача. натянула на сферу интерактивный мувиклип, все отлично но почему то кнопки не срабатывают.
Material=new MovieMaterial(l);
Material.opposite=true;
Material.animated=true;
Material.smooth=true;
Material.interactive = true ;
Material.allowAutoResize =true;

в чем может быть причина. Материал, то есть swf с картой мира написан на actionscript2.

3Desian
01.10.2010, 11:23
Если на Вашем 3Д объекте натянут MovieMaterial и Вы хотите , что бы на нём работали кнопки, то нужно проделать следующее:
1. В самом мувике (movie) подписать кнопку (But_1) на события в кадре где она расположена .
2.Создать там же обработчик события в котором при помощи dispatchEvent выпустить событие "WasClick".

But_1.addEventListener(MouseEvent.MOUSE_OVER, functionClick);
function functionClick(event:MouseEvent):void
{
dispatchEvent(new MyEvent("WasClick"));
}

3. Подписать экземпляр объекта Этого мувика-текстуры на событие "WasClick".Это уже там , где создаёте материал MovieMaterial для объекта (для планеты).

movie.addEventListener("WasClick", clickOnSomeBut);
private function clickOnSomeBut(e:MyEvent):void
{
trace("Дааа!!! ");
}

Ах да, ещё необходимо создать свой класс и назвать его MyEvent.as

package
{
import flash.events.Event;

public class MyEvent extends Event
{
public var nameOfObject:String;
public static var GO_TO_OBJECT:String="GO_TO_OBJECT";

public function MyEvent(type:String, NameOfObject:String="")
{
super(type);

nameOfObject = NameOfObject;
}

}
}
// тут параметр NameOfObject можно использовать для опознавания конкретно нажатой кнопки.