AceMyWays
AceMyWays

Reputation: 11

Converting 2d coordinates to 3d coordinates in Qml qt3d

I have a window size width: 1500 height: 780, I would like to render the 3d object with 2d co-ordinates, giving z=1 as dummy value. Following is the qml code.(If i have to render at x=0,y=0 3d should object should render exactly the same place where the Rectangle in qml renders i.e window coordinates)

Entity {
    id: root

    property real x: 2.0
    property real y: 0.0
    property real z: 0.0
    property real scale: 1
    property var mainCam
    property var forwardRenderer
    property Material material


    components: [ trefoilMeshTransform, mesh, root.material ]

    Transform {
        id: trefoilMeshTransform
         property real userAngle: 900.0
        translation:Qt.vector3d(0,1,1) 
        property real theta: 0.0
        property real phi:0.0
        property real roll: 0.0
        rotation: fromEulerAngles(theta, phi, roll)
        scale: root.scale
    }


    Mesh {
        id: mesh
        source: "assets/obj/cube.obj"
    }
}

The code is exactly the same as wireframe example, including the camera settings. I tried to use the qt3d unproject api in qml but ended up unsuccessfully . Can you please help me with the clue?

Upvotes: 1

Views: 679

Answers (1)

Parisa.H.R
Parisa.H.R

Reputation: 3893

Please read this document about How to convert world to screen coordinates and vice versa this is good for understanding some logics. and also this.

In qt3d I get 3d coordinate by using RayCaster and ScreenRayCaster it gives you the local position and world position and screen x , y see this site from kdab and its example

RenderSettings{
    
    //all components that you need like viewport , InputSettings ,...
    
    ScreenRayCaster {
        id: screenRayCaster
        
        onHitsChanged: printHits("Screen hits", hits)
    }
}

MouseHandler {
    id: mouseHandler
    sourceDevice:  MouseDevice {}
    onReleased: { screenRayCaster.trigger(Qt.point(mouse.x, mouse.y)) }
}

function printHits(desc, hits) {
    console.log(desc, hits.length)
    for (var i=0; i<hits.length; i++) {
        console.log("  " + hits[i].entity.objectName, hits[i].distance,
                    hits[i].worldIntersection.x, hits[i].worldIntersection.y, hits[i].worldIntersection.z)
    }
}

Upvotes: 1

Related Questions