вращение дополненной реальности - PullRequest
0 голосов
/ 24 марта 2011

Я пытаюсь сделать несколько проектов дополненной реальности с помощью flartoolkit.Теперь я могу разместить на своем маркере простые трехмерные объекты, и они отлично работают, но я хочу дать своему проекту некоторые события, с которыми пользователь может взаимодействовать.Я пытаюсь отследить вращение маркера.есть контейнер: DisplayObject3D, который мое приложение использует для добавления трехмерных объектов, я проследил это: «trace (container.rotationZ)», но он просто возвращает 0.Я изучил исходный код другого AR-приложения, и он без проблем использовал вращение своего контейнерного объекта. Думаю, мне следует упомянуть, что я использую файл упражнений курса seb lee delisle papervision3d от lynda.com.У кого-нибудь есть опыт работы с флартоолкитом?Основные функции моего моего кода, как показано ниже:

public function AR_AlchemyBase()
{
    super(640,480, false); 
    cameraParams = FLARParam.getDefaultParam(WIDTH * 0.5, HEIGHT * 0.5);

    marker = new FLARCode(16, 16);
    marker.loadARPattFromFile(new MarkerPattern());

    init();
}

public function init():void
{           
    video = new Video(WIDTH, HEIGHT);
    webCam = Camera.getCamera();
    webCam.setMode(WIDTH, HEIGHT, 30);
    video.attachCamera(webCam);
    video.smoothing = true; 

    camBitmapData = new BitmapData(WIDTH *0.5, HEIGHT * 0.5,false, 0x000000);

    camBitmap = new Bitmap(camBitmapData); 
    camBitmap.scaleX = camBitmap.scaleY = 2; 
    addChildAt(camBitmap,0); 

    raster = new FLARRgbRaster(WIDTH *0.5, HEIGHT * 0.5);
    detector = new FLARSingleMarkerDetector(cameraParams, marker, 80);
    result = new FLARTransMatResult();

    viewport.x = -4;

    _camera = new FLARCamera3D(cameraParams);
    container = new FLARMarkerNode();
    scene.addChild(container);

    addSceneObjects(); 

    stage.addEventListener(Event.ENTER_FRAME, enterFrame);
}

//the function to put our objects in 
public function addSceneObjects() : void
{

    var wmat:WireframeMaterial = new WireframeMaterial(0xff0000, 1, 2);
    wmat.doubleSided = true;

    var plane : Plane = new Plane(wmat, 80, 80);
    container.addChild(plane);

    var light:PointLight3D = new PointLight3D();
    light.x = 1000;
    light.y = 1000;
    light.z = -1000;

    var fmat:FlatShadeMaterial = new FlatShadeMaterial(light, 0xff22aa, 0x0);
    var cube : Cube = new Cube(new MaterialsList({all: fmat}), 40, 40, 40);
    cube.z = -20;
    container.addChild(cube);           
}

public function enterFrame(e:Event):void
{
    var scaleMatrix:Matrix = new Matrix();
    scaleMatrix.scale(0.5, 0.5);
    camBitmapData.draw(video, scaleMatrix);

    raster.setBitmapData(camBitmapData);

    counter++; 

    if(counter == 3) counter = 0; 

    var imageFound : Boolean = false

    currentThreshold = threshold+ (((counter%3)-1)*thresholdVariance);
    currentThreshold = (currentThreshold>255) ? 255 : (currentThreshold<0) ? 0 : currentThreshold; 

    imageFound = (detector.detectMarkerLite(raster, currentThreshold) && detector.getConfidence() > 0.5) ;

    if(imageFound)
    { 
        detector.getTransformMatrix(result);
        container.setTransformMatrix(result);
        container.visible = true;

        threshold = currentThreshold;
        thresholdVariance = 0; 

        if(onImageFound!=null) onImageFound();
    } 
    else 
    {
        if(counter==2) thresholdVariance +=2; 

        if(thresholdVariance>128 ) thresholdVariance = 1; 

        if(onImageLost!=null) onImageLost(); 

    }   

    singleRender(); 
}

1 Ответ

1 голос
/ 25 марта 2011

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

Это помогло мне запустить простой пример PV3D: PV3D Учебник по базовой интерактивности

...