Hi!

I'm not sure of the source of problem so first quick introduction:

1. I want to set Camera properly to show object in Scene3d which is smaller
then QWindow.
2. I want to make proper mapping between qml view 2d coordinates and scene
3d coordinates (for example place some 3d object at location pointed by
mouse click).

I've solved those two issue in example qml code attached to the message.
This example lead to my actual question:

It looks like Scene3d frame buffer is somehow bound to dimension of
QWindow. So If I set Scene3d to be smaller it shows only fragment of
framebuffer. More precisely its part cut from left-bottom corner of buffer
matching scene size. Does it expected behaviour for this class? It leads to
few "funny", additional computations in order to set camera properly.

If I making some mistake by mentioning frame bufffer in this context then I
apologize. Still hope that my example explains what is a problem. I guess
it is worth discussing with someone involved in development and maybe its
not a bug, so I've raised topic here.

Regards,

*Łukasz Korbel *
Senior Software Developer
Email: lkor...@milosolutions.com
Skype: lukasz_korbel
*Milo Solutions*
www.milosolutions.com | Facebook <https://www.facebook.com/theMiloSolutions>
| Twitter <https://twitter.com/milosolutions>
Disclaimer: This e-mail and any attachments contain information that may be
privileged or confidential and is the property of Milo Solutions. If you
are not the intended recipient, please notify me immediately by replying to
this e-mail, and then delete it. Any unauthorised
dissemination, distribution, copying or use of this communication is
strictly prohibited. The contents of an attachment to this e-mail may
contain software viruses, which could damage your own computer system.
Although this e-mail and any files attached to it may have been checked
with virus detection software before transmission you should carry out your
own virus checks before opening the attachment. No liability can be
accepted for any damage which you may sustain as a result of software
viruses.
import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Scene3D 2.0
import Qt3D 2.0
import Qt3D.Renderer 2.0

Rectangle {
    id: win
    width: 1280; height: 800
    visible: true
    color: "black"

    property real alpha: 50
    property real ratio: width/height

    //area to be full shown in scene
    property real area_width: 326
    property real area_height: 176

    //scene central point
    property real center_x: area_width / 2 + (height-scene.height)*dx/height
    property real center_y: area_height / 2 - (width-scene.width)*dy/width
    property real center_z: 0.5 * (win.height/scene.height) * area_width / Math.tan(alpha*Math.PI/360) + position_z

    //distance from center to border of visible range
    property real dx: (center_z-position_z) * Math.tan(alpha*Math.PI/360)
    property real dy: ratio*dx

    //scene offset on view y-axis
    property real off_y: height > scene.height ? height-scene.height : 0;

    //position of sphere
    property real position_x: center_x+dx-off_y*2*dx/win.height
    property real position_y: center_y+dy
    property real position_z: 0

Scene3D {
    x: 425; y: 175
    width: 300; height: 500
    focus: true
    aspects: "input"
    id: scene

    Entity {
        id: root

        components: FrameGraph {
            activeFrameGraph: Viewport {
                id: viewport
                rect: Qt.rect(0, 0, 1, 1)
                clearColor: "white"
                CameraSelector {
                   id : cameraSelector
                   camera: camera
                   ClearBuffer {
                      buffers : ClearBuffer.ColorDepthBuffer
                   }
                }
            }
        }

        Camera {
            id : camera
            projectionType: CameraLens.PerspectiveProjection
            fieldOfView: alpha
            aspectRatio: ratio
            nearPlane : center_z-position_z - 100
            farPlane :  center_z-position_z
            position: Qt.vector3d(center_x,center_y,center_z)
            upVector: Qt.vector3d(1.0, 0.0, 0.0)
            viewCenter: Qt.vector3d(center_x,center_y,0)
        }

     PhongMaterial {
            id: material
        }
        SphereMesh {
            id: sphereMesh
            radius: 10
        }
        Transform {
            id: sphereTransformation
            Translate{ translation: Qt.vector3d(position_x,position_y,position_z)}
        }

        Entity {
            components: [sphereMesh, sphereTransformation, material]
        }

        CuboidMesh{
            id: ground
            xExtent: area_width
            yExtent: area_height
            zExtent: 1
            xyMeshResolution: Qt.size(2,2)
            xzMeshResolution: Qt.size(2,2)
            yzMeshResolution: Qt.size(2,2)
        }
        Transform {
            id: groundTransformation
            Translate{ translation: Qt.vector3d(area_width/2,area_height/2,0)}
        }
        Entity {
            components: [ground, groundTransformation, material]
        }
    }

}

MouseArea {
    anchors.fill: parent
    onClicked: {
        position_x = center_x+dx - (mouse.y-scene.y+off_y)*2*dx/win.height
        position_y = center_y+dy - (mouse.x-scene.x)*2*dy/win.width
        console.log("click ("+mouse.x+","+mouse.y+")")
    }
}

}
_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to